2012-06-13 153 views
2

我想強制方法(或構造函數)參數的默認值某種形式的語義邏輯。這是我曾嘗試:鏈接器問題與構造函數參數的默認值

#include <iostream> 
#include <vector> 
class Test 
{ 
public: 
    static const std::vector<int> staticVector; 
    Test (const std::vector<int> &x = Test::staticVector) {} 
}; 

int main() 
{ 
    Test x; 

    return 0; 
} 

雖然staticVector是相當多餘的,因爲C++不允許NULL作爲性病的實例:: vector的傳遞,我希望避免給構造STD冗餘呼叫: :向量(),所以我想出了這個辦法...

不幸的是,當我嘗試編譯,鏈接器引發此錯誤:

error LNK2001: unresolved external symbol "public: static class std::vector<int,class std::allocator<int> > const Test::staticVector" ([email protected]@@[email protected][email protected]@[email protected]@@[email protected]@B) 

缺少什麼我在這裏?

+2

定義'staticVector'。 – chris

+0

@chris是的,這是問題所在。謝謝。 –

回答

6

這實際上與使用默認參數無關。相反,它是靜態變量如何在C++中工作的副作用。

在C++類中有一個靜態對象是一個兩步過程。首先,你必須聲明你已經完成的靜態對象,但是你必須在某個地方實際定義它,以便C++知道哪個翻譯單元應該包含該靜態對象的一個​​定義。你可以通過書寫來做到這一點

const std::vector<int> Test::staticVector; 

在你的C++源文件的類之外的地方。這告訴C++你的源文件包含這個對象的定義,它應該解決鏈接器錯誤。

如果您有幾個不同的源文件,但不是隻有一個,那麼您應該將此行放在Test類的源文件中,而不是標頭中。

希望這會有所幫助!

+0

哦,是的,我知道我忘記了一些東西:)非常感謝。只是好奇,爲什麼總是需要在課外宣佈呢?這似乎有點奇怪...... –

+2

@ MihaiTodor-你必須在類之外聲明它,以便編譯器和鏈接器知道哪個目標文件實際上包含靜態對象的定義。這樣,鏈接器可以將對靜態對象的引用解析爲單個實體。 – templatetypedef

+0

現在我明白了理由。非常感謝您的詳細解釋! –

1

您聲明瞭靜態成員,但沒有定義它。下課後,你需要這樣的東西:

const std::vector<int> Test::staticVector; 

你可能想這取決於you'rre就用它做真正的策劃一些值初始化它。

+0

是的,你是對的。謝謝! –