[解決済み] クラス定義における static const integer メンバの定義
質問
C++では、整数型であればクラス内部でstatic 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です。
どのように解決するのですか?
私の理解では、C++は整数型である限り、クラス内部でstatic constメンバを定義することができます。
あなたはある意味正しいです。 クラス宣言で静的定数積分を初期化することは許されていますが、それは定義ではありません。
興味深いことに、std::minへの呼び出しをコメントアウトすると、コードは(test::Nが前の行でも参照されているにもかかわらず)うまくコンパイルおよびリンクされます。
何が起こっているのかについて、何か考えはありますか?
std::minはconst参照によってそのパラメータを取ります。 もし値で受け取るのであれば、この問題は発生しませんが、参照が必要なので、定義も必要です。
以下は章/節です。
9.4.2/4 - もし
static
のデータメンバはconst
積分またはconst
列挙型の場合、クラス定義でその宣言に 定数初期化子 を指定することができる。これは,積分定数式でなければならない(5.19)。 この場合,メンバは,積分定数式に現れることができる。 そのメンバがプログラム中で使用される場合も,名前空間スコープで定義しなければならず,名前空間スコープの定義に 初期化子 .
可能な回避策については、Chuさんの回答を参照してください。
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み】静的定数文字列(クラスメンバ)
-
[解決済み] experimental::filesystem リンカエラー
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++