Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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

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++,想实现一个基于Scott Meyer的“更有效的C++”的概念,项目30。问题是在使用带有自定义数据结构的下标运算符时,如何区分读取和写入_C++_Templates_Operator Overloading - Fatal编程技术网

模板中用于下标运算符重载的代理类 我正在刷上C++,想实现一个基于Scott Meyer的“更有效的C++”的概念,项目30。问题是在使用带有自定义数据结构的下标运算符时,如何区分读取和写入

模板中用于下标运算符重载的代理类 我正在刷上C++,想实现一个基于Scott Meyer的“更有效的C++”的概念,项目30。问题是在使用带有自定义数据结构的下标运算符时,如何区分读取和写入,c++,templates,operator-overloading,C++,Templates,Operator Overloading,因此,我正在尝试创建一个模板,如下所示: map<int> im; im["foo"] = 69; cout << im["foo"] << endl; // outputs 69 im["bar"] = im["foo"]; map-im; im[“foo”]=69; 你没读到错误吗?它说您不能创建类型为Helper的对象,因为构造函数Helper::Helper是私有的。这是真的Helper应该是friend class map。好了,就是这样-谢谢你指

因此,我正在尝试创建一个模板,如下所示:

map<int> im;
im["foo"] = 69;
cout << im["foo"] << endl; // outputs 69
im["bar"] = im["foo"];
map-im;
im[“foo”]=69;

你没读到错误吗?它说您不能创建类型为
Helper
的对象,因为构造函数
Helper::Helper
是私有的。这是真的
Helper
应该是
friend class map
。好了,就是这样-谢谢你指出了这一点。现在我明白了,从这里开始,这是一个“聪明”的问题。
#include <iostream>
#include <map>
using std::string;

namespace mymap {

template <typename T> class map
{
   private:
   std::map<string,T> container;

   public:

   class Helper {
      map& m;
      string key;
      Helper (map& mm, string kkey): m(mm), key(kkey) {};

      public:

      operator T() const // rvalue use
      {
         std::cout << "op char()" << std::endl;
         return m.container[key];
      }

      Helper& operator=(T i) // lvalue use
      {
         m.container[key] = i;
         return *this;
      }

      Helper& operator=(const Helper& rhs) // lvalue use
      {
         m.container[key] = rhs.m.container[rhs.key];
         return *this;
      }
   };


   const Helper operator[]( string key) const // for const maps
   {
      return Helper(const_cast<map&>(*this), key);
   }

   Helper operator[](string key) // for non-const maps
   {
      return Helper(*this, key);
   }

   friend class Helper;

};

} // mymap namespace
 using namespace mymap;
 using mymap::map;
 using std::cout;

 int main(void) 
 {
     map<int> im;
 }
error: ‘mymap::map<T>::Helper::Helper(mymap::map<T>&, std::string) [with T = int, mymap::map<T> = mymap::map<int>, std::string = std::basic_string<char>]’ is private