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;    
};

cpp :

const double CFoo::VPI = 0.5;

無関係な別の問題がここにあります:

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

表現CFoo aFoo();は、あなたが思っていることをしません。aFoo型のオブジェクトを宣言し、のデフォルト コンストラクターCFooを使用して初期化すると思います。CFooしかし、実際に行うことは、パラメータをとらず、 by 値aFooを返すという名前の関数を宣言することです。CFooこれは、最も厄介な parseとして知られています。あなたが望むことをするために、単純に括弧を省略してください:

CFoo aFoo;
于 2012-11-12T16:33:43.803 に答える