如何解决此错误?
我的头文件
template<typename T>
class C1 {
public:
typedef std::vector<T::F> TFV;
TFV Function1();
};
我的CPP文件
template<typename T>
TFV C1::Function() //error: ‘TFV’ does not name a type
{ }
答案 0 :(得分:14)
首先,使用typename
关键字告诉编译器将F
解释为类型的(限定)名称:
typedef std::vector<typename T::F> TFV;
// ^^^^^^^^
其次,TFV
不是全局命名空间中定义的类型,因此您必须在Function1()
的定义中正确地限定它:
template<typename T>
typename C1<T>::TFV C1<T>::Function1()
// ^^^^^^^^ ^^^^^^^ ^^^
{ }
最后,类模板的成员函数的定义应放在头文件中,除非您为所有模板实例提供显式实例化,否则您将隐式生成。
如果不这样做,很可能会导致链接器发生未解决的引用错误。
答案 1 :(得分:7)
拥有C ++ 11?然后使用尾随返回类型。
template<typename T>
class C1 {
public:
typedef std::vector<typename T::F> TFV;
TFV Function1();
};
template<typename T>
auto C1<T>::Function1() -> TFV { }
这是有效的,因为在函数的参数()
之后,在这种情况下,范围与{}
块内的范围相同。您可以访问this
(与decltype结合使用),并且您可以在没有范围解析运算符的情况下使用TFV
。