Никакое “переопределение ошибки параметра по умолчанию” для функции членства шаблона класса?

Почему следующее не дает ошибки компиляции?:

// T.h

template<class T> class X
{
public:
    void foo(int a = 42);
};

// Main.cpp

#include "T.h"
#include <iostream>

template<class T> void X<T>::foo(int a = 13)
{
    std::cout << a << std::endl;
}

int main()
{
    X<int> x;
    x.foo();   // prints 42
}

Кажется, как будто эти 13 просто тихо проигнорированы компилятором. Почему это?
Вещь cookie состоит в том, что, если определение шаблона класса находится в Main.cpp вместо заголовочного файла, я действительно получаю ошибку переопределения параметра по умолчанию.

Теперь я знаю, что компилятор будет жаловаться на это, если это было просто дежурное блюдо (нешаблон) функция.

Что стандарт должен сказать о параметрах по умолчанию в функциях членства шаблона класса или шаблонах функций?

8
задан 19 March 2010 в 19:39
поделиться

1 ответ

8.3.6 §6 Аргументы по умолчанию в определении функции-члена что появляется вне определения класса добавляются к набору аргументов по умолчанию, предоставленных объявлением функции-члена в определении класса .
[Пример:

 класс C {
void f (int i = 3); 
void g (int i, int j = 99); {{ 1}}}; 
void C :: f (int i = 3) // ошибка: аргумент по умолчанию уже 
 {} // указан в области класса 
void C :: g (int i = 88, int j) // в этой единице перевода 
 {} // C :: g можно вызывать без аргументов 
 

- end example]

По стандарту он должен выдать ошибку.

3
ответ дан 6 December 2019 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: