【问题标题】:How can I pass a default argument of other type to a parameter?如何将其他类型的默认参数传递给参数?
【发布时间】:2015-12-30 13:44:14
【问题描述】:

假设我有这个 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: 注意:MyStruct::MyStruct(const MyStruct&)

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

(这里是示例代码: http://melpon.org/wandbox/permlink/izWCnBXl9PGnmm0l)

【问题讨论】:

  • 您希望从0 转换为MyStruct 的具体操作是什么?将所有成员初始化为0?如果参数作为5 传入怎么办?根据我收集的信息(包括您指定成员的大小),我认为您最好使用std::bitset

标签: c++ casting initialization default-arguments


【解决方案1】:

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

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

我猜您正在尝试使用0,因为它不仅是一个整数,而且还是一个空指针常量。但是您在这里没有使用指针。使用0 是错误的做法。

【讨论】:

    【解决方案2】:

    只需将转换构造函数添加到您的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,将您的结构包含在联合中也是一个很好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多