2014-09-29 80 views
-3

下面的代碼給出的gcc 4.7的誤差在我class.cpp:未定義的引用與靜態常量

auto TLV1 = std::make_pair(UNSIGNEDCHAR_STATIC_CONST, Value1); 
    auto TLV2 = std::make_pair(UNSIGNEDCHAR_STATIC_CONST, Value2); 

UNSIGNEDCHAR_STATIC_CONST是在類中定義static const unsigned char,值是vector<unsigned char>定義函數

編輯:在我class.h:

static const unsigned char UNSIGNEDCHAR_STATIC_CONST = 0x4F; 

鏈接器錯誤:

undefined reference to `foo::UNSIGNEDCHAR_STATIC_CONST' 
undefined reference to `foo::UNSIGNEDCHAR_STATIC_CONST' 

下面的代碼不會重現錯誤:

unsigned char t = UNSIGNEDCHAR_STATIC_CONST; 
    auto TLV1 = std::make_pair(t, Value1); 
    auto TLV2 = std::make_pair(t, Value2); 

編輯: 我做了它的鑄造工作好,謝謝尼爾Krik:

auto TLV1 = std::make_pair(static_cast(UNSIGNEDCHAR_STATIC_CONST), Value1); 

或弗拉德解決方案,在cpp文件中:

const unsigned char foo::UNSIGNEDCHAR_STATIC_CONST= 0x4F 
+0

我不知道,這就是爲什麼我問... – MokaT 2014-09-29 09:27:01

+2

有在C++的問題,你必須在一個類定義一個靜態常量,並嘗試與需要參照的功能,用它。這可能會以某種方式在C++ 11中解決,可能使用'constexpr',我不知道。試試'std :: make_pair((unsigned char)(UNSIGNEDCHAR_STATIC_CONST),Value1);' – 2014-09-29 09:27:39

+0

'UNSIGNEDCHAR_STATIC_CONST'聲明的完整代碼行是什麼? – Niall 2014-09-29 09:29:28

回答

1

編譯器要求定義此靜態成員。目前只在班內申報。

包括在一些CPP模塊以下行

const unsigned char foo::UNSIGNEDCHAR_STATIC_CONST; 

根據C++標準

3如果非易失性const的靜態數據成員是一體或 枚舉類型的,其聲明在類定義中可以指定 括號或等號初始值設定項,其中每個初始化子句是一個常量表達式(5.19)。靜態數據 文字類型的成員可以在類定義中用 constexpr說明符聲明;如果是,它的聲明應指定一個 括號或等號初始值設定項,其中每個初始化子句 賦值表達式都是一個常量表達式。 [注意:在這兩種情況下, 中的成員都可能出現在常量表達式中。 - 結束註釋 ]如果程序中的odr-used(3.2)和的名稱空間範圍定義 不包含初始化程序,則成員仍應在名稱空間範圍內定義(如果它是 )。

+0

謝謝。它工作,所以如果我理解的很好,當我在頭文件中定義以下內容時:'static const unsigned char UNSIGNEDCHAR_STATIC_CONST = 0x4F;',沒有內存分配,我不能使用是作爲右值嗎? – MokaT 2014-09-29 09:56:47

+1

@MoKaT編譯器只有在不需要它的地址時才能使用它。例如,你可以使用這個常量來定義一個數組的大小。編譯器只是在編譯時將其替換爲值。類的靜態數據成員只在類中聲明。如果它們是ODR使用的(在C++標準中有這樣的術語),它們必須被定義。 – 2014-09-29 10:00:18

+1

@MoKaT查看我更新的帖子。有一個錯字。如果在類中的聲明中指定了靜態常量數據成員的初始化程序,則不應在數據成員的定義中指定它。 – 2014-09-29 10:07:01