0

std::map を値として含むシングルトン デザイン パターンに基づいてクラスを作成しようとしています。

  //Data.h
    #ifndef Data_h
#define Data_h

// from std
#include<map> 


using namespace std;

template <typename T>

class Data
{
 private:
  Data();
  virtual ~Data();
  map<string,T >* value_map;
  static Data<T> *m_data;

 public:
  //list of method
  static Data<T>*  instance()
{
  if (NULL == m_data){
    m_data=new Data;
  }
  return m_data;
}
  virtual T getValue(string name);
  virtual void insert(string name, T value);
  //virtual void finish();
  // member field

};
#endif
   // Data.cpp

    #include"Data.h"
#include<iostream>

//implementation of class data
//which is based on singleton pattern design

template <typename T>
Data<T>::Data()
{
  value_map=new map<string, <T> >();
}


template <typename T>
Data<T>::~Data()
{ 
}



template <typename T>
T Data<T>::getValue(string name)
{
  return value_map[name];
}

template <typename T>
void Data<T>::insert(string name,T value)
{
  typedef map<string, typename T> mapa;
  value_map->insert(typename mapa::value_type(name,value));
} 

残念ながら、このコードはコンパイルできません。値をマップに挿入できるようにするには、何を変更する必要がありますか。よろしくお願いします。


.cpp ファイルと .h ファイルをマージしました。現在、コードは次のようになっています。

#ifndef Data_h
#define Data_h

// from ROOT-  nie wiem jak zrobic 
#include<map> 
#include<string>


using namespace std;

template <typename T>

class Data
{
 private:
  Data();
  virtual ~Data();
  map<string,T > *value_map;
  static Data<T> *m_data;

 public:
  //list of method
  static Data<T>*  instance()
{
  if (NULL == m_data){
    m_data=new Data;
  }

  return m_data;
}
  virtual T getValue(string name);
  virtual void insert(string name, T value);
  //virtual void finish();


};

template <typename T>
Data<T>::Data()
{
  value_map=new map<string, T>();
};


template <typename T>
Data<T>::~Data()
{ 
};

template <typename T>
T Data<T>::getValue(string name)
{
  return value_map[name];
};

template <typename T>
void Data<T>::insert(string name,T value)
{

   typedef map<string, T > mapa;
  value_map->insert( mapa::value_type(name,value));
};


#endif

しかし、盗むとコンパイルされません。クラスを修正するにはどうすればよいですか。特に、メソッドの挿入はコンパイル エラーを返します。あなたからの便りを楽しみにしています。

4

1 に答える 1

1

テンプレートを使用しています。コードをヘッダー (.h) とソース (.cpp) に分離して、コードを機能させたり、Data.h にすべてのコードを含めたり、Data.h ファイルの末尾に include ディレクティブを追加したりすることはできません。

#include Data.cpp
于 2013-01-18T04:52:28.863 に答える