Ошибка компиляции шаблона с внутренним классом - PullRequest
0 голосов
/ 06 декабря 2011

Я столкнулся с кодом шаблона, который не компилируется, и я не уверен, что понимаю почему. Кажется, проблема связана с использованием внутреннего класса с определением метода вне строки. Ниже приведен простой пример:

template<typename T> 
class Outer {
public:
    struct Inner {
        T a;
        Inner(T _a) : a(_a) {}
    };
    int foo(T a);
};

template<typename T>
Inner Outer<T>::foo(T a) {         //Line 43
     Inner ret(a);
     return ret;
}

int main(int argc, char *argv[]) {
    Outer<int> out;
    return 0;
}

g ++ 4.2.1 завершается с ошибкой: error: expected constructor, destructor, or type conversion before ‘Outer’ со ссылкой на строку 43, отмеченную выше. Код работает нормально, когда я перемещаю определение foo в строку.

Я также пытался заменить Inner на Outer<T>::Inner в строке 43, но это не имело значения.

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

У вас две проблемы. Сначала вы объявили, что возвращаете int. Но во-вторых, вам нужно typename Outer<T>::Inner, если вы хотите получить доступ к типу Inner вне области Outer.

0 голосов
/ 06 декабря 2011

Определение Inner недоступно вне класса, которое включает объявления возвращаемых значений.Это должно выглядеть так:

template<typename T>
typename Outer<T>::Inner Outer<T>::foo(T a) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...