C ++模板t无效的模板类型

时间:2018-10-19 10:45:41

标签: c++ templates

我的.h文件:

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

static TPath *getIdealPath(QList<TPath *> &paths);
};

我的.cpp文件:

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

这会在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'

如果我将TPath *的返回类型替换为例如int,它可以工作。你能请教吗?

1 个答案:

答案 0 :(得分:9)

TPath是在UpdateUtils中定义的嵌套类,您应该对其进行限定并使用typename关键字。例如

template <typename T>
typename UpdateUtils<T>::TPath *UpdateUtils<T>::getIdealPath(QList<TPath *> &paths)
^^^^^^^^^^^^^^^^^^^^^^^^^

或按照@PiotrSkotnicki的建议应用trailing return type

template <typename T>
auto UpdateUtils<T>::getIdealPath(QList<TPath *> &paths) -> TPath *
^^^^                                                     ^^^^^^^^^^

请注意,对于超出类定义的成员函数定义,将在类范围中查找在参数列表和尾随返回类型中使用的名称,因此您无需限定它们(限定它们就可以了虽然)。这不适用于返回类型。 [basic.scope.class]/4

  

延伸到类定义末尾或超出该类定义末尾的声明的潜在范围也扩展到其成员定义所定义的区域,即使成员是在类外部按词法定义的(这包括嵌套的静态数据成员定义)类定义和成员函数定义,包括成员函数主体以及此类声明的声明器部分的任何部分,该部分遵循declarator-id(包括参数声明子句和任何默认参数)。