Нет «переопределения ошибки параметра по умолчанию» для функции-члена шаблона класса? - PullRequest
8 голосов
/ 19 марта 2010

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

// 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 просто игнорируется компилятором. Почему это?
Дело в том, что если определение шаблона класса находится в Main.cpp вместо заголовочного файла, я действительно получаю переопределение параметров по умолчанию error.

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

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

1 Ответ

3 голосов
/ 19 марта 2010

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

class C {
    void f(int i = 3);
    void g(int i, int j = 99);
};
void C::f(int i = 3) // error: default argument already
{ }                  // specified in class scope
void C::g(int i = 88, int j) // in this translation unit,
{ }                          // C::g can be called with no argument

- конец примера]

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

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