我在下面编写代码但收到错误消息
调用过载' Shape()'含糊不清
我可以看到有一个没有参数的构造函数,然后 为什么 我得到Shape()构造函数的歧义错误消息, 如何 可以解决吗?我可以看到它适用于对象s2
和s3
但不适用于没有参数的构造函数。
当我宣布s1
时如下:
Shape s1();
//而不是Shape s1
然后我收到print
Shape
方法的关注消息。 为什么? 和 non-class type
指的是什么 ?
请求会员'打印' in' s1',这是非类型' Shape()'
class Shape {
int j;
public:
int i;
const char* const c;
double print() const {
printf("Value of i is %d, j is %d and c is %s\n", i, j, c);
return 0;
}
Shape() :
i(10), j(0), c("Some string") {
}
Shape(int i = 10) :
i(10), j(10), c("Some String") {
this->i = i;
}
Shape(char* c) :
i(), j(), c(strcpy(new char[strlen(c)], c)) {
}
};
int main() {
Shape s1; // call of overloaded 'Shape()' is ambiguous
Shape* s2 = new Shape(1);
Shape s3("Some string");
s1.print(); // When using Shape s1() I am getting request for
// member 'print' in 's1', which is of non-class type 'Shape()'
return 0;
}
答案 0 :(得分:3)
问题是它无法弄清楚是否要打电话
Shape(int i = 10)
,i = 10
或Shape()
形状s1;
可能
Shape(10);
(第二个)
要么
Shape();
(第一个)
删除第二个构造函数的默认输入(用i替换i = 10 - >或删除第一个构造函数
答案 1 :(得分:2)
这是因为你有两个适用的构造函数:一个没有参数,一个带参数,也有一个默认值。
如果你有两个构造函数,可以调用它们,编译器应该调用哪一个?显然,编译器不知道并告诉您对构造函数的调用是不明确的。
要解决此问题,您需要通过删除第二个构造函数的默认值,显式传递值或删除其中一个构造函数来消除构造函数的歧义。