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

C++ error: Member declaration not found

本文关键字:成员 声明 找不到 错误 C++      更新时间:2023-10-16

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

非常感谢!

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

理由是,模板必须替换为实际类型以及使用时生成和编译的类型的源,编译器当然不能为可能出现的每一种类型预编译模板,因此用户需要能够处理这一点(因此,需要访问代码)。

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

"找不到成员声明"是由Eclipse静态分析工具(codan)而非编译器产生的错误。如果你得到这个错误,但编译成功,这是一个假阳性。众所周知,该工具的旧版本会出现一些误报,例如,请参阅此错误报告。因此,我建议将EclipseCDT更新到最新版本。如果这没有帮助,请向EclipseCDT提交一份错误报告。

但是,如果您也从编译器中得到错误(这些错误由Problems视图的Type列中的C/C++Problem指示),那么您可能忘记了包含头文件。

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