В настоящее время я прохожу курс C++ на Pluralsight, и у меня возникли проблемы с выяснением того, почему пример функции шаблона работает в VS Community 2013 с использованием компилятора MS, но не в моей предпочтительной среде IDE CLion 1.2 с использованием g++ в Ubuntu 15.04. Я также пробовал компилятор OSX10.10/CLion 1.2/Xcode с теми же ошибками. (Примечание: для cmake CLion задано значение «-std=c++11»).
Простая функция принимает массив 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 CLion IDE следующие ошибки отображаются для строк 22 и 23 (два вызова функции суммы):
ошибка: нет подходящей функции для вызова 'sum'
сопровождается примечанием отладчика:
примечание: шаблон-кандидат игнорируется: ошибка замены: выведенный нетиповый аргумент шаблона не имеет того же типа, что и соответствующий ему (sic) параметр шаблона («unsigned long» vs «int»)
int sum(arrayvalues)
^
Обратите внимание, действительно понимаю, первое, что я попробовал, это использовать параметр typename для шаблона:
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
? Это упоминается в сообщении об ошибке, но его нет в коде, который вы показываете. - person Some programmer dude   schedule 04.11.2015