Конструктор по умолчанию, определенный с аргументами по умолчанию вне определения класса, почему это работает? и что происходит с шаблонами? - PullRequest
6 голосов
/ 24 июля 2011

Я знаю, что это дурной тон и что в объявлении должны быть указаны значения по умолчанию, но если вы не возражаете, пожалуйста, на мгновение ... почему это компилируется?и что именно происходит?

#include <iostream>
using namespace std;

class test
{
public:
    test(int n);
};

test::test(int n = 666)
{
    cout << n;
}

int main()
{
    test t;

    cin.sync();
    cin.ignore();

    return 0;
}

Вывод: 666

.. как шаблоны влияют на один и тот же кусок кода?

template <class T>
class test
{
public:
    test(int n);
};

template <class T>
test<T>::test(int n = 666)
{
    cout << n;
}

int main()
{
    test<int> t;

    cin.sync();
    cin.ignore();

    return 0;
}

Ошибка: нет подходящего конструктора по умолчанию, доступного

Спасибо за ваше время!

Ответы [ 2 ]

4 голосов
/ 24 июля 2011

Похоже, что спецификация C ++ специально разрешает первый случай и запрещает второй!

Цитата из спецификации C ++ (& sect; 8.3.6 / 4):

Для не шаблонных функций аргументы по умолчанию могут быть добавлены в более поздние объявления функции в той же области.

Таким образом, похоже, что для не шаблонных функций вы можете ввести аргументы по умолчанию позже. Не знаю, почему это не работает для шаблонов!

1 голос
/ 24 июля 2011

Первый случай допустим по стандарту; Я помню, что это спросил @Johannes и ответил @Nawaz. (Изменить: Вот связанный вопрос ).

Причина, по которой версия template не разрешена, заключается в том, что функции template вызываются только при явном создании экземпляра. В вашем случае компилятор смотрит на объявление как,

test<int> t;

-> Редактировать : Может отличаться от компилятора к компилятору. В gcc отлично работает . <- </p>

Почему это может не работать в каком-то компиляторе может быть Поскольку вы явно не создаете экземпляр как t(N), компилятор не сможет решить test<T>::test(int n = 666). Таким образом, он ищет конструктор по умолчанию без аргумента, который не найден; что приводит к ошибке.

...