Почему следующее не дает ошибки компиляции?:
// 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.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]
По стандарту он должен выдать ошибку.