2014-04-23 103 views
1

編譯應該是一個簡單的代碼行時,我收到了一個來自Clang的奇怪錯誤。錯誤的std ::向量構造函數

此代碼產生一個錯誤:

size_t s = 5; 
std::vector<double> bestScores{s, -1.0}; 

我只是試圖用constructor #2,以填補新的矢量五個-1.0值。我得到的錯誤是在初始化程序列表中,非常量表達式不能從類型'size_type'(又名'unsigned long')縮小爲'double'。

這是怎麼回事?這編譯罰款:

std::vector<double> bestScores{5, -1.0}; 

它試圖使用初始化程序列表構造函數?我以爲你需要兩個花括號:

std::vector<double> bestScores{{5, -1.0}}; 
+3

你並不需要初始化列表構造兩個花括號,除了'的std :: array'的混亂和過時的原因。 –

+0

@MooingDuck那一定是我想到的。謝謝 –

+2

也許你應該閱讀[C++ 11 - Uniform initialization](http://en.wikipedia.org/wiki/C++11#Uniform_initialization),特別是最後兩段。 –

回答

8

問題是你正在使用大括號包含的初始化列表構造向量。這適用於std::initializer_list<T>構造函數。在這種情況下,size_t,-1.0列表與std::initializer_list<double>兼容,因此構造函數被選中。您需要使用老式的,C++ 03建築:

std::vector<double> bestScores(s, -1.0); 

這是括號括起初始化的陷阱之一。對於某些標準庫容器實例,它們不能很好地發揮作用。你必須記住std::initializer_list構造函數將勝過其他。

4

問題是,當一個類有一個std::initializer_list構造函數時,如果參數可以轉換爲initializer_list類型(在這種情況下爲double),它將更喜歡使用統一初始化語法。請在 programmers.stackexchange.com處查看詳細的答案。

現在,您的解決方案是使用使用括號的非統一語法。這意味着它不會考慮構造函數std::initializer_list,並在這種情況下做你想做的事情。

std::vector<double> bestScores(s, -1.0)