我讀上GTEST介紹,發現這部分困惑:爲什麼這是「無效的C++」
編譯器抱怨「未定義的引用」到一些靜態 const成員變量,但我並定義它們在課堂上。 有什麼問題?
如果你的類有一個靜態數據成員:
// foo.h class Foo { ... static const int kBar = 100; };
您還需要定義它的類體之外foo.cc中:
const int Foo::kBar; // No initializer here.
否則你的代碼是無效C++,並可能會突破 的方式。特別是在Google Test比較聲明 (EXPECT_EQ等)中使用它會生成一個「未定義參考」鏈接器錯誤。
有人可以解釋爲什麼在類中定義一個靜態常量而不在類體外定義它是非法的C++嗎?
類體中的明顯定義不是形式上的*定義*,它只是一個*聲明*。它只能使用該值,而不能用於使用該對象。 C++ 98標準在這裏(在其ODR中)有問題,關於什麼時候被「使用」了,但是它大部分都是在C++ 0x中修復的。 –
如果會有任何對它的引用,你需要在源文件(.cpp)中轉發聲明靜態變量。 – AJG85