C++:重载的“basic_string()”的调用不明确
C++: Call of overloaded ‘basic_string()’ is ambiguous
我必须把我的代码发给你,因为我无法解释为什么会出现这个错误
我知道我本可以使用模板。。
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);
}
相关文章:
- 使用 MINGW gcc 编译时,不会为 std::string 调用重载的新运算符
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 错误:调用"es_queue::set_rpc_vector(std::vector >&, std::__cxx11::string)"没有匹配函数
- C++:没有匹配调用'(concat) (std::string&)'
- 自动将 std::string 转换为 char* 而无需每次都调用 c_str() 的最佳方法
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 无法手动调用 std::string 的析构函数
- 没有匹配函数调用 std::forward(const std::string &) 与可变参数
- 使用 std::string 调用系统?
- 调用类解构函数时,std::string 会抛出错误
- QVariant 转换无法识别我的模板调用的 std::string
- 动态创建 std::string 时的两个"新"调用
- 为什么隐式转换为 std::string 不适用于运算符<<被调用
- 通过引用传递 std::string 不会更新调用函数中的字符串值
- C++ 错误:对 '(std::string {aka std::basic_string}) (<char>无符号整数、字符)的调用不匹配
- 在抛出 std::string 实例后终止调用
- map<string, int> 从 const 函数调用时会抛出 std::out_of_range
- C++ 入门第 9 章没有编译:"useConvs.cc:50:19:错误:重载的调用"stod(std::string&)"是不明确的"
- 使用 std::map<:string, std::string, std::string> c++ 调用 Java 函数<String, String>
- 使用std::string调用类方法