内部类的模板编译错误

时间:2011-12-05 20:25:48

标签: c++ templates

我遇到了一些无法编译的模板代码,我不确定我理解为什么。问题似乎与使用具有外部方法定义的内部类有关。以下是一个简单的例子:

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的定义移动到内联时,代码工作正常。

我还尝试在第43行用Inner替换Outer<T>::Inner,但这并没有什么区别。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你有两个问题。首先,您声明它返回int。但其次,如果要访问Outer范围之外的Inner类型,则需要typename Outer<T>::Inner

答案 1 :(得分:0)

Inner的定义在类之外是不可用的,包括返回值声明。它应该看起来像:

template<typename T>
typename Outer<T>::Inner Outer<T>::foo(T a) {