C++:重载的“basic_string()”的调用不明确

C++: Call of overloaded ‘basic_string()’ is ambiguous

本文关键字:string 调用 不明确 重载 basic C++      更新时间:2023-10-16

我必须把我的代码发给你,因为我无法解释为什么会出现这个错误
我知道我本可以使用模板。。

class Mappable {
    typedef boost::variant<int, bool, unsigned short, float, char, timeval,
            double, std::string, size_t> MultiType;
private:
    class Handler {
        friend class Mappable;
    public:
        template<typename T>
        operator T&() {
            T t = 0;
            try {
                t = boost::get<T>(it);
            } catch (...) {
            }
            return t;
        }
        template<class T>
        Handler& operator=(const T& rhs) {
            it = rhs;
            return *this;
        }
    private:
        Handler(MultiType& it, const std::string& key);
        MultiType& it;
    };
public:
    Mappable(const std::string& tableName);
    virtual ~Mappable();
    Handler operator[](const std::string& key) {
        return Handler(map_[key], key);
    }
    std::string keyTypeToString(const std::string& key) {
        std::stringstream ss;
        ss << boost::get<T>(map_[key]);
        return ss.str();
    }
private:
    typedef std::map<std::string, MultiType> MultiTypeMap;
    std::string valueFromKey(const MultiTypeMap::iterator& it);
    template<class T> 
    MultiTypeMap map_;
};
/* Main.cpp */
int main() {
   Mappable m;
   m["x"] = 2;
   m["data"] = "my data string value"; /* Correctly works */
   cout << (int)(m["x"]); /* Correctly works */
   cout << (string)(m["data"]); /* Error */
   cout << m.keyTypeToString<string>("data"); /* Correctly works */
}

错误为:

../src/data/Mappable.h:98:41: error: call of overloaded ‘basic_string(Mappable::Handler)’ is ambiguous
../src/data/Mappable.h:98:41: note: candidates are:
/usr/include/c++/4.6/bits/basic_string.tcc:214:5: note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT*, const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]
/usr/include/c++/4.6/bits/basic_string.tcc:171:5: note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]
/usr/include/c++/4.6/bits/basic_string.tcc:179:5: note: std::basic_string<_CharT, _Traits, _Alloc>::basic_string(const _Alloc&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]

我不明白哪里有歧义!

您可以隐式转换为任何类型。

template<typename T> operator T&();

这意味着,basic_string的任何单参数隐式构造函数都是可行的(char const*、std::string等)

咒语是:隐性转化是邪恶的

在C++11中,您可以将explicit关键字添加到转换中。这意味着您将显式调用static_cast<>

    template<typename T>
    explicit operator T&() { // throws on type mismatch
        return boost::get<T>(it);
    }
相关文章: