我遇到了一些无法编译的模板代码,我不确定我理解为什么。问题似乎与使用具有外部方法定义的内部类有关。以下是一个简单的例子:
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
,但这并没有什么区别。
有什么想法吗?
答案 0 :(得分:3)
你有两个问题。首先,您声明它返回int
。但其次,如果要访问Outer范围之外的Inner类型,则需要typename Outer<T>::Inner
。
答案 1 :(得分:0)
Inner的定义在类之外是不可用的,包括返回值声明。它应该看起来像:
template<typename T>
typename Outer<T>::Inner Outer<T>::foo(T a) {