Параметр шаблона по умолчанию в конструкторе - PullRequest
2 голосов
/ 07 мая 2009

Итак, у меня есть этот фрагмент кода, и для удобства я хочу, чтобы параметр по умолчанию для его конструктора имел тип 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 ]

3 голосов
/ 07 мая 2009

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

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

int main(){
    mama<> x; // no argument based template parameter deduction possible
}
3 голосов
/ 07 мая 2009

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

class mama {
  private:
    template<typename x> void init(x i) { /* ... */ }
  public:
    template<typename x> mama(x i) { init(i); }
    mama() { init((int)0); }
};
0 голосов
/ 07 мая 2009

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

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

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

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