16

次のコードを使用すると、リンカ エラーに困惑します。

// static_const.cpp -- complete code
#include <vector>

struct Elem {
    static const int value = 0;
};

int main(int argc, char *argv[]) {
    std::vector<Elem> v(1);
    std::vector<Elem>::iterator it;

    it = v.begin();
    return it->value;
}

ただし、これはリンク時に失敗します。何らかの方法で、静的 const の「値」のシンボルが必要です。

$ g++ static_const.cpp 
/tmp/ccZTyfe7.o: In function `main':
static_const.cpp:(.text+0x8e): undefined reference to `Elem::value'
collect2: ld returned 1 exit status

ところで、これは -O1 以上で問題なくコンパイルされます。しかし、より複雑なケースではまだ失敗します。gcc バージョン 4.4.4 20100726 (Red Hat 4.4.4-13) を使用しています。

私のコードで何が間違っているのでしょうか?

4

6 に答える 6

9

struct内で初期化する場合は、それも実行できます。

struct Elem {
    static const int value = 0;
};

const int Elem::value;
于 2011-04-01T01:07:29.497 に答える
5

のように書いてみてください。

struct Elem {
    static const int value;
};

const int Elem::value = 0;

etc

.

于 2011-04-01T01:13:29.480 に答える
2

この投稿も参照してください。基本的に、問題は、コンパイラがコードを拡張して Elem::value のアドレスを取得することです。

于 2014-01-07T19:12:58.233 に答える
2

staticクラスメンバーは、通常、1 つのコンパイル単位でクラスの外部で定義される (内部で宣言され、外部で定義される) と想定されています。

constそれが静的な整数メンバーのインライン初期化とどのように相互作用するか覚えていません。

于 2011-04-01T01:14:34.643 に答える
1

なぜこれをしないのですか?

return Elem::value;

しかし、答えは、宣言で値を割り当てているということです。これは、 などの基本型で機能するはずintであり、複雑な型 (つまり、int の代わりに文字列がある場合などのクラス) にのみ必要です。私が実際に見つけたのは、使用しているコンパイラのバージョンに応じて、これがヒットまたはミスすることです。そして、ご存知のように、どの最適化レベルです。

于 2011-04-01T01:16:28.780 に答える