C++ 重载包含模板对象的容器类的运算符[]
首先,我有一个模板类,如下所示:C++ 重载包含模板对象的容器类的运算符[],c++,templates,operator-overloading,C++,Templates,Operator Overloading,首先,我有一个模板类,如下所示: 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_t
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;}
};
模板
类可配置
{
公众:
//受保护:
T值;
std::字符串变量名称;
std::字符串变量类型;
可配置()
:变量值(0)、变量名称(“未命名”)、变量类型(“未定义”)
{}
可配置(T v_值、标准::字符串v_名称、标准::字符串v_类型)
:var_值(v_值)、var_名称(v_名称)、var_类型(v_类型)
{}
std::string get_name(){return var_name;}
};
我还有一个名为Config的容器类,它有两个不同的可配置列表,用于存储可配置的int、bool和float。我想重载Config的[]运算符,以便它从其中一个列表返回具有给定名称(无论类型)的可配置文件,但这似乎不起作用:
template <typename T>
Configurable<T>& operator[] ( const std::string v_name_arg );
模板
可配置和运算符[](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 );
};
类配置
{
公众:
//私人:
标准::列表<可配置>列表\u int;
标准::列表<可配置>列表\u浮动;
std::列表list\u-double;
标准::列表list\u bool;
//公众:
Config(){}
模板
可配置和运算符[](const std::string和v_name_arg);
};
如上所述,这是一个语法错误
当你写作时:
template <typename T>
Configurable<T>& operator[] ( const std::string v_name_arg );
模板
可配置和运算符[](const std::string v_name_arg);
您试图将独立运算符[]定义为独立函数。但是根据您的解释,操作符[]应该是容器配置的成员 因此,its的定义应该类似于:
template <typename T>
class Config {
//...
public:
Configurable<T>& operator[] (const std::string v_name_arg) { /* return a ref to a Configurable */ };
};
模板
类配置{
//...
公众:
可配置&operator[](const std::string v_name_arg){/*返回对可配置的*/}的引用;
};
有了这样的定义,这些东西就可以编译了,您可以使用它,例如:
int main()
{
Configurable<int> c;
Config<int> cfg;
auto a = cfg["test"];
}
intmain()
{
可配置c;
配置cfg;
自动a=cfg[“测试”];
}
在没有依赖于模板参数的任何参数的情况下声明模板化的运算符[]
的问题在于,编译器无法通过调用config[“name”]
来确定类型T
。
考虑到代码可读性,一种解决方案是将运算符[]
更改为如下方法:
template <typename T>
Configurable<T>& get ( const std::string v_name_arg );
模板
可配置和获取(const std::string v_name_arg);
然后,调用应写为:
config.get<int>("name")
config.get(“名称”)
也可以考虑按引用传递字符串(<代码> const STD::String和),以避免不必要的拷贝<代码> STD::String 传递给方法/操作符。
请提供一个显示问题的最小工作示例。特别是,显示在何处声明了运算符[]
,以及在何处尝试使用它。另一方面,类Configurable
的大多数细节对于您的问题可能并不重要(您将在生成MWE时发现)。如果函数模板(至少)有一个模板参数未推导,则必须通过显式提供未推导的模板参数来调用该模板。由于运算符重载试图简化(或协调)语法,因此这对运算符函数模板不起作用。您必须像obj.operator[](arg)
那样调用它们,没有像obj[arg]
这样的变体。您的类没有运算符[]
,但有一个运算符[]
模板。由于无法从参数推断其模板参数,因此需要显式提供它们,例如config.operator[](“foo”)
。这当然使得操作符[]
语法毫无用处。实际上操作符重载在Config类中,我应该指定它。此外,Config类有多个不同可配置类型的容器,而不仅仅是一个,因此很遗憾,它不起作用。好吧!您的容器
是模板类吗?或者您是否只使用实例模板therin(即可配置、可配置等…>?您是否可以向我们展示该类的外观(尤其是您要索引的容器帐户的定义)?“您尝试定义一个独立的运算符[],就像它将是一个独立的函数一样。”一个自由的运算符[]
将有2个参数。这不是(语法)错误,只是不是很有用。@dyp I遇到了问题,因为该运算符显然是在类之外声明的,而standard在13.5.5中称为Subscripting:operator[]应该是一个只有一个参数的非静态成员函数。哦,对了。我永远记不起哪些是允许作为非成员的。不过,它是一个有效的成员函数模板。