Code::Blocks可运行的C++代码在VS中报构造函数匹配错误求助
问题分析与解决方案
首先,咱们来拆解下你遇到的问题——明明在Code::Blocks里能正常运行的代码,到Visual Studio就抛出no instance of constructor "book::book" match the argument list的错误,核心问题出在拷贝构造函数的参数类型上。
先看你写的拷贝构造函数:
book(book&a) { npage = a.npage; strcpy_s(title, a.title); }
这里的参数是非const的左值引用,而Visual Studio的MSVC编译器对C++标准的遵循更严格:当你尝试用临时对象(比如book myBook = book("C++ Primer")这种场景)或者const类型的book对象来初始化新对象时,非const引用是无法绑定到这些对象上的,这就导致编译器找不到匹配的构造函数,直接报错。
修复方案
把拷贝构造函数的参数改成const引用,这也是C++标准中拷贝构造函数的标准写法——既能保证不修改源对象,又能兼容所有合法的初始化场景:
book(const book& a) { // 给参数加上const修饰 npage = a.npage; strcpy_s(title, a.title); }
另外再补充两个小细节,让代码更规范:
- 你的构造函数
book(char t[], int p = 33)里,char t[]会被编译器当作char* t处理,而字符串字面量(比如"Hello")在C++11及以后是const char*类型,建议把参数改成const char* t,避免潜在的类型转换警告。 - 把
p()函数的实现补全,比如:
void p() { cout << "书名:" << title << endl; cout << "页数:" << npage << endl; }
修改后的完整代码示例:
#include<iostream> #include<cstring> using namespace std; class book { private: int npage; char title[30]; public: // 构造函数:参数改为const char*,更符合标准 book(const char* t, int p = 33) { npage = p; strcpy_s(title, t); } // 拷贝构造函数:改为const引用 book(const book& a) { npage = a.npage; strcpy_s(title, a.title); } // 补全打印函数 void p() { cout << "Title: " << title << endl; cout << "Pages: " << npage << endl; } }; int main() { book b1("Effective C++"); book b2 = b1; // 调用拷贝构造函数 b2.p(); book b3 = book("C++ Concurrency in Action", 500); // 用临时对象初始化,现在可正常编译 b3.p(); return 0; }
这样修改后,代码在Visual Studio里就能正常编译运行了,同时也符合C++标准规范,在其他编译器里也能保持一致的行为。
内容的提问来源于stack exchange,提问作者El Mazghi Mohamed
相关产品推荐
相关产品推荐

