首先,我有一个如下所示的模板类:
template <typename T>
class Configurable
{
public:
//protected:
T var_value;
std::string var_name;
std::string var_type;
Configurable()
: var_value(0), var_name("unnamed"), var_type("undefined")
{}
Configurable( T v_value, std::string v_name, std::string v_type )
: var_value(v_value), var_name(v_name), var_type(v_type)
{}
std::string get_name() {return var_name;}
};
我还有一个名为 Config 的容器类,它有几个不同的 Configurable 列表,用于存储 Configurable int、bool 和 float。我想重载 Config 的 [] 运算符,以便它从列表之一返回具有给定名称(无论类型如何)的 Configurable,但这似乎不起作用:
template <typename T>
Configurable<T>& operator[] ( const std::string v_name_arg );
编译器返回“不匹配运算符[]”的错误。所以我的问题是 - 我怎样才能使这项工作?甚至可以使用模板来完成,还是我应该找到一种不同的继承方法?
编辑:对于所有的困惑,我们深表歉意。这是我正在谈论的容器类:
class Config
{
public:
//private:
std::list < Configurable<int> > list_int;
std::list < Configurable<float> > list_float;
std::list < Configurable<double> > list_double;
std::list < Configurable<bool> > list_bool;
//public:
Config(){}
template <typename T>
Configurable<T>& operator[] ( const std::string &v_name_arg );
};
最佳答案
在没有任何依赖于模板参数的参数的情况下声明模板化operator[]
的问题在于,编译器无法从表单中的调用中确定类型T
配置[“名称”]
。
考虑到代码的可读性,一种解决方案是将 operator[]
更改为如下方法:
template <typename T>
Configurable<T>& get ( const std::string v_name_arg );
那么,调用应该这样写:
config.get<int>("name")
此外,考虑通过引用传递字符串 (const std::string&
) 以避免不必要的 std::string
拷贝传递给方法/运算符。
关于c++ - 为具有模板对象的容器类重载 operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25349660/