2012-01-13 59 views
8

我是C++新手。今天,我有一个问题: 在头文件中定义一个类:C++错误:找不到会员声明

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

和源文件,我编程为:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

编译时,编译器总是说:“会员声明未找到'。 为什么?

我用Eclipse CDT的+ Cygwin的GCC

非常感谢你!

+1

AFAIK你不应该在源文件中实现模板类。在标题中设置函数的定义。 – Lucian 2012-01-13 08:38:06

回答

6

模板类需要在头文件或用户包含的其他文件中声明和定义。它们不能在头文件中声明,并像平常一样在源文件中定义。

其原因在于模板必须替换为实际类型以及使用时生成和编译的模板的源代码,编译器肯定无法为每种可能出现的类型预编译模板,因此用户需要能够处理(并且需要访问代码)。

如果多个库包含相同的模板,那么在传递对象时会造成一些问题,因为它们可能会针对不同版本的头进行编译(请参阅One Definition Rule)。

0

你应该包括在头文件 结束你的源文件,或者你在头文件中定义的成员函数当你定义一个模板类

1

“找不到成员声明”是由Eclipse静态分析产生错误工具(codan)而不是编译器。如果你得到这个错误,但编译成功,这是一个误报。已知该工具的较旧版本会给出一些误报,例如参见this bug report。所以我建议将Eclipse CDT更新为最新版本。如果这没有帮助,请向Eclipse CDT提交错误报告。然而,如果你也从编译器中得到了错误(这些由Problems视图的Type列中的C/C++问题表示),那么你可能已经忘记了包含头文件。