我想我错过了一些东西,我不知道到底是什么。让我们看一下代码片段。
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"};
一切都像预期的那样。但是,当我想将用户定义的类型作为Foo的T参数时,会发生一些错误。考虑:
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}};
对我来说,没关系,我看不出为什么不向该类添加两个构造函数的任何原因,但是如果该类型不是我的,该怎么办?我应该用构造函数编写简单的包装器吗?
谢谢,阿图尔
那是因为您要在上执行汇总初始化Boo
。参见§8.5.4/ 3:
对象或类型引用的列表初始化
T
定义如下:—如果
T
为聚合,则执行聚合初始化(8.5.1)。
你打算复制构建你的Boo
......但真正你做集合初始化,从而导致试图建构int z
从Boo
,因而错误
错误:没有从“ Boo”到“ int”的可行转换
请注意,您可以用更少的代码并且没有任何模板来重现您的问题:
Boo b;
Boo b2{b}; // error
解决方法很简单。只是不要使用列表初始化:
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)
// ^^^^^^
{};
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句