2017-05-12 10 views
3

g ++:未定義の `A :: sc 'への参照、なぜですか?しかし、ステートメントa = scはOKです。テンプレートのため ?未定義の参照先、理由

#include <iostream> 

template<typename T> 
inline const T &min(const T &left, const T &right) 
{ 
    return (left < right ? left : right); 
} 

class A 
{ 
public: 
    static const size_t sc = 0; 
    A() 
    { 
     size_t tmp = 0; 
     size_t a = sc; 
     size_t b = min(sc, tmp); 
    } 
}; 

int main() 
{ 
    A a; 
    return 0; 
}                      
+1

「sc」は「min」への参照によって渡されるためだと思います。一度リファレンスを取得すると、もうコンパイル時定数にすることはできません。 –

答えて

8

あなたはクラスのメンバとして

static const size_t sc = 0; 

を持っている場合、それはまだ宣言です。プログラムでその値だけを使用する場合は、その値を定義する必要はありません。しかし、あなたが参照してそれを使用する場合は、あなたが使用してそれを定義する必要があります。

const size_t A::sc; 

ライン

size_t a = sc; 

が値によってscを使用していますが、ライン

size_t b = min(sc, tmp); 

は、参照することによりscを使用しています。そのため、scを定義する必要があります。

+3

余分な楽しい事実: 'min(+ sc、tmp)'はエラーを引き起こしません;) – Quentin

+0

あなたが私に尋ねるならば、それ自身の答えに値する@Quentin。 –

+0

Meh。私は、ODRの使用に関する技術的なことについてはっきりしていないし、実際にそのトリックを使用するのはあまりにも秘密のIMOだろう。 – Quentin