模板类外定义成员函数报错:需在TestClass::element前加typename
模板类成员函数外部定义的编译错误解析
问题场景
定义了如下模板类:
template<typename T> class TestClass { private: struct element { T data; element* ptr; explicit element(T val) : data(val), ptr (nullptr) {} }; element entity; public: T foo(int); void fee(const TestClass&); element* faa(T, bool order = true); explicit TestClass(T p1); ~TestClass() {} };
尝试在类外定义faa函数时:
template<typename T> TestClass<T>::element* TestClass<T>::faa(T val, bool order) { //blah blah blah }
出现编译错误:
main.cpp:36:1: error: need ‘typename’ before ‘TestClass::element’ because ‘TestClass’ is a dependent scope 36 | TestClass<T>::element* TestClass<T>::faa(T val, bool order) | ^~~~~~~~~~~~ | typename
错误原因
这是C++模板中**依赖名称(dependent name)**的规则导致的:
TestClass<T>是依赖于模板参数T的作用域(即错误提示里的"dependent scope")- 在编译模板的定义阶段(还未针对具体类型实例化模板),编译器无法确定
TestClass<T>::element到底是一个类型(比如这里的结构体),还是一个静态成员变量——因为模板特化可能改变这个内部结构的定义 - 因此编译器默认不会将依赖作用域内的名称当作类型处理,必须用
typename关键字显式声明这是一个类型
解决方法
在TestClass<T>::element前添加typename关键字,明确告诉编译器这是一个类型:
template<typename T> typename TestClass<T>::element* TestClass<T>::faa(T val, bool order) { // 函数实现 }
内容的提问来源于stack exchange,提问作者SogaBan
相关产品推荐
相关产品推荐

