我没有为我的类提供任何自定义构造函数,我所做的就是禁用复制构造函数:
private:
MyClass(const MyClass& other) = delete; // disable copy ctor
现在,当我尝试在堆栈上创建此类的实例时
MyClass myInstance;
我收到如下编译错误:
main.cpp:16:16: error: no matching function for call to ‘MyClass::MyClass()’
好像我无意中禁用了默认构造函数?或许复制构造函数在那里被调用,我只是不知道如何。
这是一个例子
class MyClass {
public:
int someField;
private:
MyClass(const MyClass& other) = delete; // disable copy ctor
MyClass& operator=(MyClass other) = delete; // disable assignment
};
错误
g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++0x -MMD -MP -MF"proj/main.d" -MT"pitch/main.o" -o "proj/main.o" "../proj/main.cpp"
../proj/main.cpp: In function ‘int main()’:
../proj/main.cpp:17:10: error: no matching function for call to ‘MyClass::MyClass()’
MyClass ins;
答案 0 :(得分:5)
问题是您没有默认构造函数,因此出现错误:
../proj/main.cpp:17:10:错误:没有匹配函数来调用'MyClass :: MyClass()'
您可能会感到困惑,因为在您宣布禁用的复制构造函数之前,您的代码运行正常。这是因为compiler will generate a default constructor for any class without a constructor already declared:
如果没有为类类型(struct,class或union)提供任何类型的用户声明构造函数,编译器将始终声明默认构造函数
您需要声明默认构造函数。阅读以上链接(以及hinted to by @user4581301):
如果存在一些用户声明的构造函数,则用户仍可强制编译器自动生成默认构造函数,否则将使用关键字default隐式声明。
这可以这样做:
class MyClass {
public:
MyClass() = default;
int someField;