2009-05-06 3 views
2

Итак, у меня есть этот кусок кода, и из удобства я хочу, чтобы параметр по умолчанию для его конструктора имел тип int и 0. (У меня есть больше параметров в классе моего проекта и один из них не является обязательным, и я не хочу, чтобы написать конструктор дважды из-за его большой)Параметры шаблона по умолчанию в конструкторе

class mama{ 
    public: 
    template<typename x> mama(x i=int(0)){} 
}; 

int main(){ 
    mama x; 
} 

Это не работает, потому что он говорит, что не может найти конструктор так есть еще один способ, которым я могу это сделать?

error: no matching function for call to ‘mama::mama()' 
note: candidates are: mama::mama(const mama&) 

ответ

3

реорганизовать конструктор в частную функции инициализации и обертки конструкторов, а затем добавить по умолчанию, например, так:

class mama { 
    private: 
    template<typename x> void init(x i) { /* ... */ } 
    public: 
    template<typename x> mama(x i) { init(i); } 
    mama() { init((int)0); } 
}; 
+0

Мы закончили тем же кодом. аккуратный :) –

+0

Тот факт, что ваш шаблон templated является сильным намеком для меня, чтобы templatize весь класс. YMMV! – dirkgently

+0

Возможно; Я не могу себе представить, как шаблонный конструктор, подобный этому, был бы полезен без шаблонизации класса, но это дает то, что задал исходный вопрос, а кто-то еще покрыл создание класса шаблоном :) – bdonlan

3

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

template <class T=int> 
class mama{ 
    public: 
    mama<T>(T i=0){} 
}; 

int main(){ 
    mama<> x; // no argument based template parameter deduction possible 
} 
+0

Я думал о том же :) – pankajt

-1

Значение по умолчанию работает точно так же, как перегрузка, так что ...

class mama{ 
public: 
    template<typename x> mama(x i){} 
    mama(int i = 0) {} 
}; 

При создании мамы без аргумента, то конструкция с междунарами по умолчанию сопоставляется перед любым шаблонным конструктором.

+0

Да, но это не позволяет дублировать код. Csiz хотел создать один конструктор. – Ari

+0

Если вы не хотите, чтобы тело конструктора дважды меняло его на функцию, как и предлагал bdonlan. Однако, если позже вы захотите специализировать mama :: mama (int), с решением bdonlan (с конструктором по умолчанию без аргумента вместо конструктора с int и по умолчанию 0) вы не сможете сделать это, не добавляя другого конструктора. –