具有冲突名称的类的构造方法

时间:2015-07-28 11:29:29

标签: c++ class constructor clang

我正在使用clang来使用c ++ 14方言编译我的代码。请看以下示例:

class x
{
    int _i;

public:

    x(int i)
    {
        this->_i = i;
    }
};

void x()
{
}

void f(class x my_x)
{
    // Do something here
}

int main()
{
    /*
     f(x(33)); // Doesn't work
     f(class x(33)); // Doesn't work
    */

    // This works:

    class x my_x(33);
    f(my_x);

    typedef class x __x;
    f(__x(33));
}

这里有一个名为x的类,其名称与具有相同名称的函数冲突。要区分x类和x函数,必须使用class标识符。这适用于所有情况,但我永远找不到直接调用x的构造函数的方法。

在前面的示例中,我希望通过在移动中构建它来为函数f提供x对象。但是,如果我使用f(x(33)),它会将其解释为对函数x的错误调用,如果我使用f(class x(33)),则只会产生语法错误。

有明显的解决方法,但我想知道是否有比使用临时别名对类x进行类型定义更优雅或者通过生成调用函数的整个范围来显式实例化一个会让我烦恼的项目。只需要在函数调用行中使用它。

也许有一个我不知道的简单语法?

1 个答案:

答案 0 :(得分:9)

您只需要一对括号:

f((class x)(33));

或者对于更多参数,也可以使用统一初始化:

f((class x){1, 2, 3});