1

テンプレートクラスがあります

template<class T1 ,class T2, class T3>
class server_fd
{
  T1 servport;
  T2 server_ip;
  T3 servobj;
  int local_port;

public:
  server_fd(const T1& servport, const T2& server_ip,const T3 servobj) {
    this->servport=servport;
    this->server_ip=server_ip;
    this->servobj=servobj;   

    cout <<"check \n"<<this->server_ip;
  }
};    

今、私はこのクラスのオブジェクトをマップに保存したいので、このようにマップを宣言しています..

 map<int,server_fd* > MapPairList;

この後、コードをコンパイルすると、次のエラー エラーが表示されます: テンプレート引数 2 が無効です エラー: テンプレート引数 4 が無効です

ただし、テンプレート クラスを使用しない場合は、マップを正常に定義できます。

テンプレートクラスオブジェクトを格納するためのマップを定義する他の方法はありますか? 私にお知らせください。

4

2 に答える 2

0

これらの型へのアクセスを何らかの方法で抽象化できる場合は、テンプレート クラスを抽象基本クラスから継承させ、マップ内の基本へのポインターを保持するだけではありません。

これは型消去と呼ばれ、詳細についてはこちらを参照してください。型消去のテクニック

于 2012-09-24T09:27:23.770 に答える
0

テンプレート クラスに基本クラスを追加してみてください。

class server_fd_entry {};

template<class T1 ,class T2, class T3>
class server_fd
{
    <snip>
}

...

map<int,server_fd_entry* > MapPairList;

このようにして、マップはテンプレート パラメータに関係なく、すべての server_fd タイプを格納できます。ただし、これにより多くのダウンキャストが発生することがわかります。そのため、代わりに、マップを宣言するときにすべてのテンプレート パラメーターを確実に指定することをお勧めします。

map<int,server_fd<int,int,int>* >

この方法では、特定の 1 つのタイプの server_fd のみを格納できますが、それが必要な場合は、おそらくより適切になります。

于 2012-09-24T22:33:39.113 に答える