我正在將一個多平臺項目代碼從VS2003移植到VS2013。VS2013過載錯誤(不會發生在gcc中)
我遇到了一個我無法理解的錯誤。
這是一個測試代碼,說明它:
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
類在我的項目是基礎類之一,在整個項目中使用。所以我正在尋找一個不會影響很多代碼的解決方案。
我認爲這是因爲'MyString'繼承自'std :: string'。編譯器無法在'operator +(const MyString&,const std :: string&)'和'operator +(const std :: string&,const std :: string&)'之間進行選擇。 –
不要繼承std容器。導致太多麻煩。如果需要,使用'operator std :: string'來創建自己的獨立MyString類。 –
編寫新代碼時我不會這樣做。在這種情況下,我正在維護一個以這種方式完成的舊項目。 很奇怪gcc爲什麼允許它,VS2013沒有。 我也不想修改幾百行代碼來改變這個類,因爲繼承的變化。 – Urban