根据我对C++的了解,我提出了一个无法解释的问题。

我有一个类,它恒定引用类型X的结构,但是当我传递类型X的参数(之前已初始化)时,我从编译器中收到一个错误,说它无法转换为成员的第一个成员X。这对我来说没有任何意义。

该错误在clang和g++中相似,这使我认为我缺少了一些过分的东西。
error: no viable conversion from 'const Foo::X' to 'Foo::FooTypes'
为什么要尝试从X转换为Z的第一个成员FooTypes?

class Foo {
public:
    enum FooTypes {
        JPEG
    };
    struct Z {
        FooTypes type;
        int a;
    };

    struct X {
        Z caps;
        double host_address;
    };
    Foo(const X& x);
private:
    const X x;
};

Foo::Foo(const Foo::X& x) :
                x{x}    {
}
int main() {
    Foo::X new_x = {
        {Foo::JPEG, 1}, 1.58 };
    Foo *s = new Foo(new_x);
    delete s;
    return 0;
}

最佳答案

您应该使用圆括号而不是大括号:

...
    const X m_x;
};
Foo::Foo(const Foo::X& x) :
    m_x(x) {
}
...

这是列表初始化:
...
m_x{x.caps, x.host_address}
...

编辑
@PauloNeves
我刚刚找到了Bjarne Stroustrup的文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2640.pdf,其中包含下一个定义:



我认为描述的成员初始化是您的情况。对我而言,它看起来像g++ 4.9缺陷。

关于c++ - 结构初始化中隐式拷贝构造函数出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34422739/

10-11 22:06
查看更多