使用正确的运算符重载将对象转换为std :: string时出错

时间:2014-11-19 15:08:39

标签: xcode templates c++11 operator-overloading

Follwing短程序将与VS 2013完美搭配并达到标记点。但是在XCode中,编译器会因为模糊的构造函数而显示错误。如何解决?

#include <iostream>
#include <string>

class atest
{
public:
    explicit operator const char *()
    {
        return "";
    }
    template<class T> operator T()
    {

    }
    operator std::string()
    {
        return std::string("Huhuhu");
    }
    template<class T> atest &operator =(T value)
    {

    }
    atest &operator =(const std::string &value)
    {
        return *this; // I want to reach this point
    }
};

int main(int argc, char* argv[])
{
    atest tst;

    //   auto a = (std::string)tst;
    std::string astr;

    // do some stuff

    astr=tst; // I wanna keep this line

    return 0;
}

Clang无法区分VS2013采用正确结构的不同构造函数。我现在搜索一种排除赋值运算符的“const char *”模板的方法。

2 个答案:

答案 0 :(得分:1)

std::string有多个constructors采用单个参数,因为您为std::string 提供了转换运算符,这是一个通用的任意类型转换运算符,编译器根本不知道要选择哪个构造函数。

答案 1 :(得分:0)

我认为你写了太多的重载函数。您需要的唯一功能是:

operator std::string()
{
    return std::string("Huhuhu");
}

评论休息全部,你的代码就可以了。