无法在初始化中转换类型

阿图尔·毕斯祖克(Artur Pyszczuk)

我想我错过了一些东西,我不知道到底是什么。让我们看一下代码片段。

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 zBoo,因而错误

错误:没有从“ 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

类型转换,“初始化”:无法从“ HtmlBuilder *”转换为“ HtmlElement”

初始化程序是在Swift中转换为新类型的一种方式

无法初始化类型'HttpClientHandler'

K&R毫秒计算-初始化-类型转换

复制初始化-从'int'转换为非标量类型

类型转换或初始化,在Swift中哪个更好?

通过类型转换变量的地址来初始化引用

切片类型的初始化方法无法初始化

无法使用集合初始化程序初始化类型

初始化指针数组-无法使类型* [] type

错误:无法推断“自动”类型(需要初始化程序)

Delphi 2007无法启动:类型初始化程序异常

无法为类型'UnsafeMutablePointer'调用初始化程序

无法初始化类型的变量-链接错误

无法从“初始化列表”转换为 UserController

'初始化':无法从'Array <int,3>'转换为'int'

初始化时无法将“ <括号包围的初始化程序列表>”转换为“ int *”

无法初始化SqlParameter

无法初始化Firebase

无法初始化变量

向量无法初始化

无法初始化Mockito

CameraX无法初始化

无法初始化Datepicker

无法初始化 SharedPreferences

错误:无法使用“布尔”类型的右值初始化“类型*”类型的返回对象

错误:无法使用初始化程序列表初始化非聚合类型“ vector <int>”

无法使用集合初始化程序初始化类型“ PeopleModel”,因为它未实现“ System.Collections.IEnumerable”

无法使用集合初始化程序初始化类型x,因为它未实现“ System.Collections.IEnumerable”