VS2013过载错误(gcc不会发生)

时间:2014-03-31 12:27:47

标签: c++ windows visual-studio overloading

我正在从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

我的项目中的类是基本类之一,用于整个项目。所以我正在寻找一种不会影响很多代码的解决方案。

2 个答案:

答案 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指出了正确的方向。