2015-02-03 3 views
1

У меня есть класс, как следующее:Конструктор шаблонов Variadic и пустой конструктор?

template<typename ... TTypes> 
class Composite { 
public: 
    //Composite() : null(true) { } 
    Composite(TTypes... values) : values(std::make_tuple(values...)), null(false) { } 
private: 
    bool null; 
    std::tuple<TTypes...> values; 
}; 

int main(int argc, char *argv[]) { 
    Composite<int, char, int> a1; 
} 

Но это приводит к ошибке, потому что второй конструктор будет превалировать первый с TTypes = {}. Есть ли способ сохранить пустой конструктор?

Бест, Moritz

+5

Используйте один конструктор с пакетом параметров. Он также будет действовать как конструктор по умолчанию. – 0x499602D2

+0

Вы уверены? Я получаю следующее сообщение об ошибке, если удалить первый конструктор: StandardTypes.hpp: 560: 5: Примечание: Композитный :: Композитного (TTypes ...) [с TTypes = {Varchar <50u>, Чара <1u>, Varchar <50u>} ] StandardTypes.hpp: 560: 5: примечание: кандидат ожидает 3 аргумента, 0 предоставлено. И для меня они имеют смысл, потому что второй конструктор ожидает аргументов. – moo

+0

У вас, очевидно, больше кода, который мы не видим, поэтому включите сообщение * full * error и код, который его производит. Измените это на вопрос. – 0x499602D2

ответ

0

Я не уверен, вокруг ли следующая работа является вариантом для вас:

template<typename ... TTypes> 
class Composite : public ValueSet { 
public: 
    Composite(TTypes... values) { } 
}; 

template<> 
class Composite<> : public ValueSet { 
public: 
    Composite() : ValueSet() { } 
}; 

, но это работает.

+0

Нет, это не работает для моего основного метода. Я не могу инициализировать переменную следующим образом: Композитный a1; – moo

+0

добавьте пустой конструктор в первый класс. он не находится в противоречии с конструктором шаблона, потому что он только создаст конструктор 'Composite (int, char, int)' в данном примере. – example

Смежные вопросы