Я думаю, что я что-то пропустил, и я не знаю, что именно. Давайте посмотрим на фрагмент кода.
template <typename T>
struct Foo {
Foo (int n, int p, string s, T t = {})
: m_n {n}, m_p {p}, m_s {s}, m_t {t}
{}
const int m_n;
const int m_p;
const string m_s;
T m_t;
};
И использование выглядит так:
Foo<int> f_int1 {1, 2, "A", 155};
Foo<int> f_int2 {1, 2, "A"};
Все как задумано. Но когда я хочу иметь определяемый пользователем тип в качестве T-параметра Foo, возникают некоторые ошибки. Рассмотреть возможность:
struct Boo {
int z;
int l;
};
И использование:
Foo<Boo> f_boo1 {1, 2, "A"};
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}};
Обе эти инструкции дают (gcc 4.8.1):
cannot convert ‘Boo’ to ‘int’ in initialization
Я могу создавать объекты Boo следующим образом:
Boo boo1 {};
Boo boo2 {1, 2};
Итак, не могли бы вы сказать мне, где проблема?
Возможное решение:
struct Boo {
Boo () : z {}, l {} {}
Boo (int p1, int p2) : z {p1}, l {p2} {}
int z;
int l;
};
И обе приведенные ниже инструкции работают по назначению:
Foo<Boo> f_boo1 {1, 2, "A"};
Foo<Boo> f_boo2 {1, 2, "A", {1, 2}};
Для меня это нормально, я не вижу причин, почему бы не добавить два конструктора в класс, но что делать, если тип не мой? Должен ли я написать простую оболочку с конструкторами?
Спасибо, Артур