私の理解では、C ++では、静的なconstメンバーが整数型である限り、クラス内で定義できます。
では、次のコードでリンカエラーが発生するのはなぜですか。
#include <algorithm>
#include <iostream>
class test
{
public:
static const int N = 10;
};
int main()
{
std::cout << test::N << "\n";
std::min(9, test::N);
}
私が得るエラーは:
test.cpp:(.text+0x130): undefined reference to `test::N'
collect2: ld returned 1 exit status
興味深いことに、std :: minへの呼び出しをコメントアウトすると、コードは正常にコンパイルおよびリンクされます(test :: Nも前の行で参照されていますが)。
何が起こっているかについて何か考えはありますか?
私のコンパイラはLinux上のgcc 4.4です。
char
、代わりにとして定義できますconstexpr static const char &N = "n"[0];
。に注意してください&
。リテラル文字列は自動的に定義されるため、これは機能すると思います。私はこれについてちょっと心配しています-文字列はおそらく複数の異なるアドレスにあるため、異なる変換ユニット間のヘッダーファイルで奇妙な動作をする可能性があります。
inline const int N = 10
ます。私の知る限り、リンカによってどこかにストレージが定義されています。この場合、キーワードインラインを使用して、クラス定義テスト内で静的変数を定義することもできます。