在C++中使用模板参数的Typedef

use*_*748 3 c++ templates typedef

我该如何解决这个错误?

我的头文件

template<typename T>
class C1 {
public:
typedef std::vector<T::F> TFV;
TFV Function1();
};
Run Code Online (Sandbox Code Playgroud)

我的CPP文件

template<typename T>
TFV C1::Function() //error: ‘TFV’ does not name a type
{ }
Run Code Online (Sandbox Code Playgroud)

And*_*owl 14

首先,使用typename关键字告诉编译器将其解释F为类型的(限定)名称:

typedef std::vector<typename T::F> TFV;
//                  ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

其次,TFV不是全局命名空间中定义的类型,因此您必须在以下定义中正确限定它Function1():

    template<typename T>
    typename C1<T>::TFV C1<T>::Function1()
//  ^^^^^^^^ ^^^^^^^      ^^^
    { }
Run Code Online (Sandbox Code Playgroud)

最后,类模板的成员函数的定义应放在头文件中,除非您为所有模板实例提供显式实例化,否则您将隐式生成.

如果不这样做,很可能会导致链接器出现未解决的引用错误.


ipc*_*ipc 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 { }
Run Code Online (Sandbox Code Playgroud)

这是因为在函数的参数之后,()在这种情况下,范围与{}块内部相同.您可以访问this(与decltype结合使用),您可以在TFV没有范围解析运算符的情况下使用.