C ++ Доступ к этому в новом синтаксисе объявления функций - PullRequest
5 голосов
/ 22 февраля 2012

При использовании нового синтаксиса объявления функции и decltype как получить доступ к членам? Похоже, что this недоступно:

template <typename Func>
struct context_binder
{
public:
    context_binder(const Func& func) :
            func(func)
    { }

    template <typename... TArgs>
    auto operator ()(TArgs&&... args) const
            -> decltype(this->func(std::forward<TArgs>(args)...))
    {
        return func(std::forward<TArgs>(args)...);
    }
private:
    Func func;
};

Это приводит к ошибке компилятора:

scratch.cpp:34:25: error: invalid use of ‘this’ at top level

Мой компилятор g++ 4.6.2.


Мой обходной путь - объявить статический член с именем self того же типа, что и класс, что имеет две проблемы:

  1. Он не будет автоматически подбирать CV-квалификаторы, как this.
  2. Мне нужно переместить объявления членов * на 1020 * выше использования decltype или он не может видеть член (хотя это больше похоже на ошибку компилятора).

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012

Обновление до GCC 4.7. Версия 4.6 не поддерживает this там, где вы пытаетесь его использовать.

Другой вопрос охватывает некоторые обходные пути, которые вы можете использовать.

2 голосов
/ 22 февраля 2012

У вас есть две ошибки. Единственная ошибка - это то, что вы заметили сами. Другая ошибка заключается в том, что вы пытаетесь получить доступ к члену до его объявления. Объявите его перед использованием (обратите внимание, что возвращаемый тип, даже если он указан в конце, не может получить доступ к элементам, которые вы объявляете позже, в отличие от тела функции).

template <typename Func>
struct context_binder
{
private:
    Func func;

public:
    context_binder(const Func& func) :
            func(func)
    { }

    template <typename... TArgs>
    auto operator ()(TArgs&&... args) const
            -> decltype(this->func(std::forward<TArgs>(args)...))
    {
        return func(std::forward<TArgs>(args)...);
    }
};

Так что 2), который вы называете недостатком своего обходного пути, на самом деле не является недостатком, потому что реальный способ его кодирования все еще требует объявления участника перед его использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...