2

请考虑以下迷你示例

// CFoo.hpp
class CFoo{
private:
    static const double VPI = 0.5;    
public:
    double getVpi();
};

// CFoo.cpp
#include "CFoo.hpp"    
double CFoo::getVpi(){
    double x = -VPI;
    return x;
}

// main.cpp
#include "CFoo.hpp"    
int main(){
    CFoo aFoo();
    return 0;
}

使用 gcc 4.5.1 版本的程序会产生错误CFoo.cpp: undefined reference to CFoo::VPI。错误不会发生,如果

  • VPI 未被否定
  • 否定写为double x = -1 * VPI;
  • CFoo 类的声明和定义发生在同一个文件中

你知道这个错误的原因吗?

4

1 回答 1

5

您的代码存在多个问题。首先,这不是有效的 C++03:

class CFoo{
private:
    static const double VPI = 0.5;    
// ...
};

const当且仅当该初始化程序是整数或const枚举类型 时,静态数据成员的声明才能指定常量初始化程序。0.5两者都不是,因此您的代码不是有效的 C++。 9.4.2 静态数据成员包括:

2/ 静态数据成员在其类定义中的声明不是定义 [...]静态数据成员的定义应出现在包含该成员的类定义的命名空间范围内。[...]

4/ 如果一个静态数据成员是 const 整数或 const 枚举类型,它在类定义中的声明可以指定一个常量初始化器,它应该是一个整数常量表达式(5.19)。

为了初始化VPI,您必须在 CPP 文件中这样做:

标题:

class CFoo{
private:
    static const double VPI;    
};

cp:

const double CFoo::VPI = 0.5;

另一个不相关的问题在这里:

int main(){
    CFoo aFoo(); // NOT OK
    return 0;

表达式CFoo aFoo();没有做你认为它做的事情。您认为它声明了一个aFoo类型的对象并使用的默认构造CFoo函数对其进行初始化。CFoo但它实际上做的是声明一个名为aFoo不带参数的函数,CFoo按值返回。这被称为最令人头疼的解析。为了做你想做的事,简单地省略括号:

CFoo aFoo;
于 2012-11-12T16:33:43.803 回答