C ++错误:找不到成员声明

时间:2012-01-13 08:31:44

标签: c++ declaration member

我是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

非常感谢你!

3 个答案:

答案 0 :(得分:6)

模板类需要在标头中声明和定义,或者用户包含的另一个文件。它们不能像标题一样在标题中声明并在源文件中定义。

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

如果多个库包含相同的模板,这会导致传递对象时出现一些问题,因为它们可能会针对不同版本的标头进行编译(参见单一定义规则)。

答案 1 :(得分:1)

“未找到成员声明”是Eclipse静态分析工具(codan)而不是编译器生成的错误。如果您收到此错误,但编译成功则这是误报。已知此工具的旧版本会产生一些误报,例如参见this bug report。所以我建议将Eclipse CDT更新到最新版本。如果这没有帮助,请向Eclipse CDT提交错误报告。

但是,如果您从编译器中获得错误(这些问题在“问题”视图的“类型”列中由C / C ++问题指示),那么您可能忘记包含头文件。

答案 2 :(得分:0)

您应该将源文件包含在头文件的末尾 或者在定义模板类时在头文件中定义成员函数