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);
    }