Значение по умолчанию аргумента шаблона функции-члена

Следующий фрагмент кода компилируется в GCC 4.5.3, но не компилируется в VS 2008 и 2010. Это связано с ошибкой компилятора VS или стандарт запрещает указывать значения аргументов шаблона функции по умолчанию?

#include <cstdlib>

struct Bar
{
enum Group{ A , B , C };
};

struct Foo
{
template<typename T>
static void getSome( typename T::Group = T::A );
};

template<typename T>
void Foo::getSome( typename T::Group )
{
};

int main()
{
Foo::getSome<Bar>();            // Does not compile in VS 2008 & 2010 (compiles in gcc 4.5.3)
Foo::getSome<Bar>( Bar::C );    // Compiles in VS 2008 and gcc 4.5.3
return EXIT_SUCCESS;
}

Сообщение об ошибке

prog.cpp(11) : error C2589: '::' : illegal token on right side of '::'
prog.cpp(11) : error C2059: syntax error : '::'

1

Решение

Это ошибка MSVC.

Ошибка, как вы, наверное, догадались, заключается в обработке шаблонных функций с параметрами по умолчанию.

Их обходной путь должен предоставить все функциональные параметры. (Тьфу)

признанный Вот.

6

Другие решения

Я думаю g++ придерживается стандарта, когда он компилирует ваш фрагмент.

Следующая выдержка должна быть ссылкой на правую часть стандарта (раздел 14.1.9):

Шаблонный аргумент по умолчанию — это заданный шаблонный аргумент (14.3)
после = в шаблоне-параметре. Шаблонный аргумент по умолчанию может быть
указывается для любого типа шаблона-параметра (тип, не тип,
template), который не является пакетом параметров шаблона (14.5.3). По умолчанию
аргумент шаблона может быть указан в объявлении шаблона.
шаблон по умолчанию аргумент не должен быть указан в
template-parameter-lists определения члена класса
шаблон, который появляется за пределами класса члена. По умолчанию
аргумент шаблона не должен быть указан в шаблоне класса друга
декларация. Если объявление шаблона функции друга указывает
шаблон по умолчанию аргумент, это объявление должно быть определением и
должно быть единственным объявлением шаблона функции в
переводческий блок.

3

По вопросам рекламы [email protected]