我有一个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();
答案 0 :(得分:2)
这是一个隐晦的最令人烦恼的解析问题:
Container c3(Item());
声明函数原型,您的有用编译器会发出相应的诊断信息。
Container c3{Item()};
是修复。