如何将其他类型的默认参数传递给参数?

时间:2015-12-30 13:44:15

标签: c++ casting initialization default-arguments

假设我有这个prog.cc文件:

struct MyStruct
{
  unsigned int X : 2;
  unsigned int Y : 2;
  unsigned int Spare : 28;
};

void MyFunc (int x, MyStruct myStruct = 0);


int main ()
{
    MyStruct myStr;
    myStr.X = 1;
    myStr.Y = 0;
    MyFunc(6);
}

void MyFunc (int x, MyStruct myStruct)
{
    x += 10;
}

使用GCC 4.4.7编译时,出现此错误:

  

prog.cc:7:错误:'MyStruct myStruct'的默认参数类型为'int'

现在,我理解错误,但仍然 - 我该如何解决这个问题? 我知道我需要以某种方式从int投射到MyStruct,但两者都

MyStruct myStruct = (MyStruct)0

MyStruct myStruct = static_cast<MyStruct>0

失败了:

  

prog.cc:7:错误:没有匹配函数来调用'MyStruct :: MyStruct(int)'

     

prog.cc:1:注意:候选人是:MyStruct :: MyStruct()

     

prog.cc:1:note:MyStruct :: MyStruct(const MyStruct&amp;)

如何简单地初始化我的用户定义的struct,作为函数参数的默认参数传递?

(以下是示例代码: http://melpon.org/wandbox/permlink/izWCnBXl9PGnmm0l

2 个答案:

答案 0 :(得分:7)

您可以默认初始化POD,因此:

void MyFunc (int x, MyStruct myStruct = MyStruct());

我猜你试图使用0,因为它是一个整数,它是一个空指针常量。但是你没有在这里使用指针。使用0是错误的做法。

答案 1 :(得分:1)

只需将转换构造函数添加到MyStruct

即可
struct MyStruct
{
  unsigned int X : 2;
  unsigned int Y : 2;
  unsigned int Spare : 28;
  MyStruct(int n) : X(n&3), Y(n&12), Spare(0) {}
};

它的实现取决于你的语义,但你得到了技术观点。如果你想让你的结构可以转换为int,那么将你的结构包含在一个联合中也是一个很好的解决方案。