C++ C++;:调用重载‘;基本字符串()’;含糊不清
我必须把我的代码发布给你,因为我无法解释为什么会出现这个错误C++ C++;:调用重载‘;基本字符串()’;含糊不清,c++,eclipse,templates,boost,C++,Eclipse,Templates,Boost,我必须把我的代码发布给你,因为我无法解释为什么会出现这个错误 我知道我可以使用模板 class Mappable { typedef boost::variant<int, bool, unsigned short, float, char, timeval, double, std::string, size_t> MultiType; private: class Handler { friend class Mappabl
我知道我可以使用模板
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 */
}
类可映射{
typedef boost::variant多类型;
私人:
类处理程序{
朋友类可映射;
公众:
样板
算子T&(){
T=0;
试一试{
t=boost::get(it);
}捕获(…){
}
返回t;
}
样板
处理程序和运算符=(常量T和rhs){
它=rhs;
归还*这个;
}
私人:
处理程序(多类型&it,常量std::string和key);
多类型&it;
};
公众:
可映射(const std::string和tableName);
虚~可映射();
处理程序运算符[](常量std::string和key){
返回处理程序(映射[key],key);
}
std::string keyTypeToString(const std::string和key){
std::stringstream-ss;
ss可以隐式转换为任何类型
template<typename T> operator T&();
您可以隐式转换为任何类型
template<typename T> operator T&();
你说“行得通”,但实际上它不起作用。它可以编译(尽管它甚至不应该这样做——使用-pedantic-Wall-Werror
)。但它将在运行时失败,因为您正在返回对本地对象的引用。实际上,您的代码中存在与错误无关的其他问题,即处理程序
类中的转换运算符用于转换为引用类型。因此,这意味着您返回对本地变量的引用,这无疑会导致在.No Joachim中,返回的引用是我想要的:通过这种方式,我可以访问元素并修改它。@Velthune不,不是。您返回的引用无效。请参阅我的第一条评论。您说“有效”,但实际上无效。它可以编译(尽管它甚至不应该这样做–使用-pedantic-Wall-Werror
)。但它将在运行时失败,因为您正在返回对本地对象的引用。实际上,您的代码中存在与错误无关的其他问题,即处理程序
类中的转换运算符用于转换为引用类型。因此,这意味着您返回对本地变量的引用,这无疑会导致lt in.No Joachim,返回的引用是我想要的:通过这种方式,我可以访问元素并修改它。@Velthune不,不是。您返回的引用无效。请参阅我的第一条评论。该死,我尝试在处理程序构造中插入“explicit”,但在“operator T&”中没有插入.我忘了遵循那个咒语,谢谢!我几乎接近解决方案了!该死,我尝试在处理程序构造上插入“显式”,但在“运算符T&”上没有。我忘了遵循那个咒语,谢谢!我几乎接近解决方案了!
template<typename T>
explicit operator T&() { // throws on type mismatch
return boost::get<T>(it);
}