我正在从VS2003“移植”多平台项目代码到VS2013。
我遇到了一个我无法理解的错误。
这是一个说明它的测试代码:
using namespace std;
class MyString : public string {
public:
MyString() : string() {};
MyString(const string &a_path) : string(a_path) {};
MyString(const MyString &a_path) : string(a_path) {};
friend MyString operator+(const MyString& path, const string& s) {
string str(path);
return str + s;
};
};
void test() {
MyString result;
MyString one;
result = one + string("aaa"); // error C2666 } }
此代码可以使用VS2003和几个(较新)版本的gcc进行编译。 VS2013编译器抱怨以下错误:
1>mystring.cpp(22): error C2666: 'operator +' : 3 overloads have similar conversions
1>mystring.cpp(12): could be 'MyString operator +(const MyString &,const std::string &)' [found using argument-dependent lookup]
1> [...]\xstring(2411): or 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> std::operator +<char,std::char_traits<char>,std::allocator<char>>(std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&)'
1> [...]\xstring(2401): or 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> std::operator +<char,std::char_traits<char>,std::allocator<char>>(std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&,const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)'
1> [...]\xstring(2391): or 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> std::operator +<char,std::char_traits<char>,std::allocator<char>>(const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,std::basic_string<char,std::char_traits<char>,std::allocator<char>> &&)'
1> [...]\xstring(2321): or 'std::basic_string<char,std::char_traits<char>,std::allocator<char>> std::operator +<char,std::char_traits<char>,std::allocator<char>>(const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &,const std::basic_string<char,std::char_traits<char>,std::allocator<char>> &)'
1> while trying to match the argument list '(MyString, std::basic_string<char,std::char_traits<char>,std::allocator<char>>)'
1> note: qualification adjustment (const/volatile) may be causing the ambiguity
我的项目中的类是基本类之一,用于整个项目。所以我正在寻找一种不会影响很多代码的解决方案。
答案 0 :(得分:1)
鉴于当前代码,您不需要(并且这意味着不应该)使操作员成为您班级的朋友,因为它不需要访问私人成员:
class MyString : public string {
public:
MyString() : string() {};
MyString(const string &a_path) : string(a_path) {};
MyString(const MyString &a_path) : string(a_path) {};
};
MyString operator+(const MyString& path, const string& s) {
string str(path);
return str + s;
};
但是,虽然这个可能会解决你的问题,但我应该提到像std::string
这样的标准库类并不是要派生出来的,所以你应该考虑其他方法(例如聚合代替继承)来实现你的目标。这也可能有助于解决您的问题,因为编译器不会将MyString
视为std::string
并对可用的重载感到困惑。
另外,我希望在课程之前使用指令&#39;定义只是为了简洁起见,因为在头文件中使用命名空间作用域的指令很少是一件好事。
更新更密切关注operator+
的实施情况,您可能希望将其完全排除,因为它会执行operator+
两次{{1}已经为你做了。
答案 1 :(得分:0)
问题的正确解决方案是使用不同的参数实现运算符。
所以操作员声明应该是:
MyString operator+(const string& path, const string& s);
而不是:
MyString operator+(const MyString& path, const string& s);
如果它的实现需要访问类MyString的某些功能,这可能是一个问题。但在我的情况下,情况并非如此。
感谢@Arne Mertz指出了正确的方向。