2012-02-13 4 views
0
template<typename std::list<int>::value_type value> 
int silly() 
{ 
    return value; 
} 

template<typename int value> 
int silly2() 
{ 
    return value; 
} 

template<int value> 
int silly3() 
{ 
    return value; 
} 

Вопрос1> Является ли value_type от std::list<int>int?Являются ли эти параметры шаблона значений одинаковыми?

Question2> Действительно ли эти три функции sillyX эквивалентны друг другу?

+0

@ AJG85- Хотя я согласен, что второй из них недействителен, первый и третий являются совершенно законными - они не являются аргументами шаблона шаблона. – templatetypedef

+0

@templatetypedef: Ну, похоже, MSVC принимает все три ... MSVC принимает много, хотя. Третий - это хорошо, первый и второй - это то, что не должно компилироваться для меня. Думаю, я был неправ. – AJG85

+0

@ AJG85: Первое допустимо, так как 'typename' может быть помещено перед любым именем с помощью * inested-name-specifier * (то есть' Class :: name' или 'Namespace :: name'). Он не может быть помещен перед неквалифицированным именем типа, поэтому второй недействителен без одного из многих «расширений» от Microsoft. –

ответ

2

Ответ 1: Да, container::value_type является typedef типа элемента содержит

Ответ 2: ваш silly2() плохо формируется с параметрами, не тип шаблона не требуется typename, если тип не квалифицируется и зависит от некоторых параметр

типа В вашей первой форме, хотя:

template<typename std::list<int>::value_type value> //you don't require typename since qualified name value_type isn't dependent, so it's avoided by compiler I guess 
int silly() 
+0

Для 'silly2' VS2010 не жалуется. Странный! – q0987

+0

@ q0987 см. Это: http://ideone.com/bAc9u, MSVS неверен –

+0

@ q0987: У этого компилятора есть много «расширений», которые принимают всевозможные недействительные коды. Существует возможность отключить большинство из них, если вы хотите получить больше шансов написать переносимый код. –

3

Для начала, код

template<typename int value> 
    int silly2() 
{ 
    return value; 
} 

Не является законным, так как определение аргумента шаблона не допускается. Вам нужно либо параметризовать шаблон по целочисленному значению, указав template <int value> или над аргументом типа, указав template <typename value>. Причина, по которой typename разрешена внутри первого шаблона, заключается в том, что она использует второй смысл typename, а именно, что следующие имена называются типом.

Кроме этого, да, (1) и (3) совпадают, поскольку для спецификации C++ ISO требуется, чтобы std::list<int>::value_type был int.

Надеюсь, это поможет!

Смежные вопросы