Ошибка параметра типа по умолчанию в коде шаблона - PullRequest
6 голосов
/ 29 сентября 2010
1)template <class T = int, class U = double> //compiles

2)template <class T, class U =double> //compiles

3)template <class T = int, class U> //fails

Почему 1 и 2 компилируются, а 3 нет?

Ответы [ 3 ]

8 голосов
/ 29 сентября 2010

По той же причине, почему:

void f(int = 0, int);

не удается.

Невозможно использовать третий вариант по умолчанию:

template<class T = int, class U> class B { ... };

B<, short> var; // ??? no such syntax
6 голосов
/ 29 сентября 2010

Если вы поместите это в некоторый контекст, третий способ может быть законным при условии, что второй параметр по умолчанию был задан ранее.

template <class T, class U = double>
struct X;

template <class T = int, class U> //here
struct X {};

int main()
{
    X<> x;
    X<float> y;
    X<char, char> z;
}
6 голосов
/ 29 сентября 2010

(3) неправильно сформирован, потому что

C ++ 03 [Section 14.1/11] говорит:

Если параметр шаблона имеет аргумент шаблона по умолчанию, все последующие параметры шаблона должны иметь заданный по умолчанию аргумент шаблона .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...