我在MS Visual Studio 2015上遇到以下问题。
我有一个带有重载构造函数的Hotel
类,它接受一个字符串参数。
当我尝试创建一个使用重载而不是默认构造函数的对象时,编译器将面临以下错误:
Error C2664 'std::Hotel::Hotel(const std::Hotel &)': cannot convert argument 1 from 'const char [7]' to 'const std::Hotel &'
Hotel.h
namespace std {
class Hotel {
public:
string hotelName; // Hotel's name.
Hotel(); // Default constructor.
Hotel(string); // Overloaded constructor.
~Hotel(); // Default destructor.
};
}
Hotel.cpp
namespace std {
Hotel::Hotel() { // // Default constructor.
}
Hotel::Hotel(string name) { // // Overloaded constructor.
hotelName = name;
}
}
的main.cpp
int main() {
Hotel Palace("Palace");
}
在我做的搜索中,我看到MSVS使用两种方法来处理字符串。我发现类似问题的解决方案是将"Palace"
转换为Hotel Palace(_T("Palace"));
当我尝试从一个以字符串以外的类型作为参数的重载构造函数创建一个对象时,会发生同样的事情。
这是明确与MSVS有关的事情,还是我做错了什么?
任何帮助都将不胜感激。
答案 0 :(得分:2)
您的代码中存在一些可能导致此错误的问题。
首先,不要使用namespace std {...}
。使用
using std::string
using std::cout
代替。您也可以使用using namespace std
,但不建议这样做。 Hotel(std::string)
也没关系。
其次,您应该在构造函数中使用explicit
修饰符:
explicit Hotel(string);
这可以防止一些意外的转换错误。
您还应该使用Hotel(const string&)
代替Hotel(string)
。这样可以防止不必要的临时副本。