Различия в функциях шаблона С++ между VC++ и g++/Xcode

В настоящее время я прохожу курс 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, а также сообщить мне правильный курс действий для достижения желаемого результата?

Большое спасибо, любой совет будет принят с благодарностью.


person ajgio23    schedule 04.11.2015    source источник
comment
Что такое arrayvalues? Это упоминается в сообщении об ошибке, но его нет в коде, который вы показываете.   -  person Some programmer dude    schedule 04.11.2015
comment
Когда вы говорите, что работает нормально, вы принимаете во внимание отсутствующую закрывающую скобку в определении шаблона?   -  person Mad Physicist    schedule 04.11.2015
comment
@JoachimPileborg sum(arrayvalues) в примечании отладчика должно читаться как sum(array‹int,n›values), и это то, что я набрал. Это мой первый пост с вопросом, возможно, мне не хватает некоторых методов форматирования.   -  person ajgio23    schedule 04.11.2015
comment
@MadPhysicist Спасибо, исправил мое плохое копирование   -  person ajgio23    schedule 04.11.2015


Ответы (1)


Нетиповой аргумент шаблона для std::array должен быть std::size_t, а не int.

template<std::size_t n>
//       ^^^^^^^^^^^
int sum(array<int, n> values)
{
    //...
}
person TartanLlama    schedule 04.11.2015
comment
Спасибо, вы случайно не знаете, что именно отличает два компилятора в этом случае и почему VC++ работает, а g++ нет? - person ajgio23; 05.11.2015
comment
@ ajgio23 ajgio23 Я не совсем уверен, может быть, это связано с тем, как они определяют std::size_t наряду с некоторой дополнительной вседозволенностью? - person TartanLlama; 06.11.2015