C++模板t不是有效的模板类型

Mar*_*sek 4 c++ templates

我的.h文件:

template <typename T>
class UpdateUtils
{
public:
typedef struct {
    QList<T> file;
} TPath;

static TPath *getIdealPath(QList<TPath *> &paths);
};
Run Code Online (Sandbox Code Playgroud)

我的.cpp文件:

template <typename T>
TPath *UpdateUtils<T>::getIdealPath(QList<TPath *> &paths) {
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会在cpp文件中产生错误:

error: C2143: syntax error : missing ';' before '*'
error: C2065: 'T' : undeclared identifier
error: C2923: 'UpdateUtils' : 'T' is not a valid template type argument for parameter 'T'
Run Code Online (Sandbox Code Playgroud)

如果我TPath *用例如替换返回类型int,它可以工作.你能给些建议么?

son*_*yao 9

TPath是一个在里面定义的嵌套类UpdateUtils,你应该限定它并使用typename关键字.例如

template <typename T>
typename UpdateUtils<T>::TPath *UpdateUtils<T>::getIdealPath(QList<TPath *> &paths)
^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

或者应用尾随返回类型为@PiotrSkotnicki建议:

template <typename T>
auto UpdateUtils<T>::getIdealPath(QList<TPath *> &paths) -> TPath *
^^^^                                                     ^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

请注意,对于类定义之外的成员函数定义,将在类范围中查找parameter-list和trailing-return-type中使用的名称,因此您不需要对它们进行限定(尽管可以对它们进行限定).这不适用于返回类型.[basic.scope.class/4

扩展到或超过类定义结尾的声明的潜在范围也扩展到由其成员定义定义的区域,即使成员是在类之外的词法上定义的(这包括静态数据成员定义,嵌套类定义,和成员函数定义,包括成员函数体和此类定义的声明器部分的任何部分,它们遵循declarator-id,包括parameter-declaration-clause和任何默认参数).

  • 或者将名称作为尾随返回类型 (5认同)