在其他构造函数的调用中调用构造函数时,C ++编译错误

时间:2018-03-12 17:05:01

标签: c++

我有一个C ++代码似乎混淆了像A::A(B b)这样的类构造函数和一个接收函数指针的构造函数,比如A::A(B (*)())。让我解释一下:

以下代码编译:

#include <iostream>
#include <cstring>
#include <vector>

struct Item {
  Item() {
    std::cout << "ITEM::Normal constructor\n";
  }
};

struct Container {
  Container(Item i) {
    std::cout << "CONTAINER::Normal constructor\n";
  }

  void doSomething() {
    std::cout << "Do something\n";
  }
};

int main() {
  Container c3(Item());
  return 0; 
}

但是如果我添加对B::doSomething()的调用,就像下面的代码一样,我得到了一个我不理解的编译器错误:

#include <iostream>
#include <cstring>
#include <vector>

struct Item {
  Item() {
    std::cout << "ITEM::Normal constructor\n";
  }
};

struct Container {
  Container(Item i) {
    std::cout << "CONTAINER::Normal constructor\n";
  }

  void doSomething() {
    std::cout << "Do something\n";
  }
};

int main() {
  Container c3(Item());
  c3.doSomething();
  return 0; 
}

编译错误是:

main.cpp: In function ‘int main()’:
main.cpp:23:6: error: request for member ‘doSomething’ in ‘c3’, which is of non-class type ‘Container(Item (*)())’
   c3.doSomething();

1 个答案:

答案 0 :(得分:2)

这是一个隐晦的最令人烦恼的解析问题

Container c3(Item());

声明函数原型,您的有用编译器会发出相应的诊断信息。

Container c3{Item()};

是修复。