我目前通過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中遇到錯誤,並且讓我知道正確的操作過程來實現期望的結果?
很多謝謝,任何意見將不勝感激。
什麼是'arrayvalues'?它在錯誤消息中提到,但它不在您顯示的代碼中。 –
當你說「工作正常」時,你是否考慮到模板定義中缺失的大括號? –
@JoachimPileborg調試器筆記中的sum(arrayvalues)應該讀取sum(數組值),這就是我輸入的內容。這是我的第一個問題,我可能會遺漏一些格式化技術。 –
ajgio23