2015-11-04 90 views
0

我目前通過Pluralsight上的C++課程開機,我在使用MS編譯器解決VS社區2013上的模板函數示例的原因時遇到了一些麻煩,我的首選IDE CLion 1.2在Ubuntu 15.04上使用g ++。我也嘗試過在OSX10.10/CLion 1.2/Xcode編譯器中使用相同的錯誤。 (注意:CLion cmake設置爲「-std = C++ 11」)VC++和g ++/Xcode之間的C++模板函數差異

簡單函數採用未知數量元素的STL數組並返回所有元素的總和。

的代碼是:

#include<array> 
#include<iostream> 
using namespace std; 

template<int n> 
int sum(array<int, n> values) 
{ 
int result = 0; 
for (auto value : values) 
{ 
    result += value; 
} 
return result; 
} 

int main() 
{ 
    array<int,5> numbers = {{1,2,3,4,5}}; 
    array<int,3> more_numbers = {{1,3,5}}; 

    cout << sum(numbers) << endl; 
    cout << sum(more_numbers) << endl; 

    getchar(); 
    return 0; 
} 

在VS 2013能正常工作,並輸出預期:

15 
9 

然而兩者上Ubuntu和OSX克利翁IDE的下列誤差一起表示爲線22和23(兩個和函數調用):

error: no matching function for call to 'sum'

伴隨着一個調試器注:

note: candidate template ignored: substitution failure : deduced non-type template argument does not have the same type as the its(sic) corresponding template parameter ('unsigned long' vs 'int')
int sum(arrayvalues)
^

注真正理解,我想的第一件事是使用類型名稱參數模板太:

template<typename T, T n> 
T sum(array<T, n> values) 
{ 
int result = 0; 
for (auto value : values) 
{ 
    result += value; 
} 
return result; 
} 

,並調用它:

cout << sum<int>(numbers) << endl; 

但由此產生的同編譯時出錯。我是否錯誤地嘗試了這個/我是否朝着錯誤的方向前進?或者這是否是解決問題的有效嘗試?

我明顯知道編譯器是如何做的,但是有人能告訴我爲什麼我在CLion中遇到錯誤,並且讓我知道正確的操作過程來實現期望的結果?

很多謝謝,任何意見將不勝感激。

+0

什麼是'arrayvalues'?它在錯誤消息中提到,但它不在您顯示的代碼中。 –

+0

當你說「工作正常」時,你是否考慮到模板定義中缺失的大括號? –

+0

@JoachimPileborg調試器筆記中的sum(arrayvalues)應該讀取sum(數組值),這就是我輸入的內容。這是我的第一個問題,我可能會遺漏一些格式化技術。 – ajgio23

回答

3

std::array的非類型模板參數應該是std::size_t而不是int

template<std::size_t n> 
//  ^^^^^^^^^^^ 
int sum(array<int, n> values) 
{ 
    //... 
} 
+0

謝謝,你碰巧意識到在這種情況下究竟是什麼使兩種編譯器不同,以及爲什麼VC++工作和g ++沒有這樣做? – ajgio23

+0

@ ajgio23我不完全確定,也許與他們如何定義'std :: size_t'以及一些額外的寬容有關? – TartanLlama