Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载包含模板对象的容器类的运算符[]_C++_Templates_Operator Overloading - Fatal编程技术网

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[]应该是一个只有一个参数的非静态成员函数。哦,对了。我永远记不起哪些是允许作为非成员的。不过,它是一个有效的成员函数模板。