我对类内部的联合和此类构造函数的参数使用相同的限定符,如下所示:

class A
{
    union
    {
        C y;
        D z;
    }
    x;
public:
    A(B x);
}

我想使用y的构造函数C(B q);

我试图这样做:
A(B x)
    :   x.y(x)
{
}

但是在这种情况下,似乎编译器(或者至少是IDE,在这种情况下为VS15)不能聪明地处理名称冲突,就好像情况更简单(例如x(x)之类)一样。

我不得不诉诸:
A(B x)
{
    this->x.y = x;
}

尝试在初始化列表中使用此指针时,出现错误“期望的标识符”。

有什么方法可以在初始化列表中达到这一行的效果?

最佳答案

您需要为联合提供一个构造函数,并因此指定一个名称:

class A
{
    union X
    {
        C y;
        D z;

        X(B b) : y(b) {}

        // other operations
    };

    X x;

public:
    A(B b) : x(b) {}
};

10-08 08:12