20

ローカルでのみ使用するクラスがあります (つまり、その対応は、それが定義されている C++ ファイルのみです)

class A {
public:
    static const int MY_CONST = 5;
};

void fun( int b ) {
    int j = A::MY_CONST;  // no problem
    int k = std::min<int>( A::MY_CONST, b ); // link error: 
                                            // undefined reference to `A::MY_CONST` 
}

すべてのコードは同じ c++ファイルにあります。Windows で VS を使用してコンパイルする場合は、まったく問題ありません。
ただし、Linux でコンパイルするundefined referenceと、2 番目のステートメントでのみエラーが発生します。

助言がありますか?

4

6 に答える 6

26

std::min<int>の引数はconst int&( だけでなくint) 両方、つまりへの参照ですint。また、参照を渡すことはできません。これは定義されA::MY_CONSTていないためです(宣言されているだけです)。

.cppクラス外のファイルに定義を提供します。

class A {
public:
    static const int MY_CONST = 5; // declaration
};

const int A::MY_CONST; // definition (no value needed)
于 2013-06-06T08:46:55.640 に答える
6
// initialize static constants outside the class

class A {
public:
    static const int MY_CONST;
};

const int A::MY_CONST = 5;

void fun( int b ) {
    int j = A::MY_CONST;  // no problem
    int k = std::min<int>( A::MY_CONST, b ); // link error: 
                                            // undefined reference to `A::MY_CONST` 
}
于 2013-06-06T08:49:40.513 に答える
2

const 値をローカル変数に保存することもできます。

class A {
public:
    static const int MY_CONST = 5;
};

void fun( int b ) {
    int j = A::MY_CONST;  // no problem
    int k = std::min<int>( A::MY_CONST, b ); // link error: undefined reference to `A::MY_CONST` 
    int l = std::min<int>( j, b);  // works
}
于 2019-05-20T12:03:03.800 に答える
0

私は非常に奇妙な状況にある

template<class T> class Strange {

public:
  static const char gapchar='-';
  };

template<class T> void Strange<T> method1 {
      char tmp = gapchar;
}

template<class T> void Strange<T> method2 {
    char tmp = gapchar;
}

上記のクラスを含めます。これは数年間機能しています。

基本的に同じ署名で、gapchar を読み取るだけの別のメソッドを追加しました。

3 つすべての方法を使用しているにもかかわらず、3 番目の方法でのみ未定義のエラーが発生しました。

次に、静的変数を初期化する方法を変更しました

クラス定義で初期化していません:

static const char gapchar;

template<class T> const char Strange<T>::gapchar='-';

これで問題は解決しました。クラス定義セクション内で int または char 型 (許可されているのは 2 つの型のみ) を初期化する古い方法が、メソッドの 1 つだけで機能しなくなり、他のメソッドでは機能しなくなる理由がわかりませんでした。

于 2014-10-02T15:59:43.257 に答える