0

私は次のような2つのテンプレートクラスを持っています

template <class T>
class MyClass1{};

template <class T>
class MyClass2{};

そして、それらを引数として使用するテンプレート関数があります。クラスはstd::string:に特化しています。

template <template class<std::string> T> myMethod(T<std::string>& arg){}

myMethod(objectOfMyClass1)とmyMethod(objectOfMyClass2)を使用したいのですが、コードがコンパイルされません。テンプレート関数用にテンプレートクラスを特殊化する方法は?

4

2 に答える 2

2

まず、メソッドが引数をとらない場合、必要に応じて呼び出すことができません。

次に、MyClass1とはクラスでMyClass2はなくクラステンプレートです。したがって、objectOfMyClass1とを使用することはできませんobjectOfMyClass2

関数が任意のタイプの形式の引数に対して特別に動作する場合、必要なのSomeClassTemplate<std::string>は部分関数テンプレートの特殊化です。これはC++では許可されていません。代わりに、部分的に特殊化されたクラスを使用する必要があります。

template <class T>
struct MyMethodCall;

template <template <typename> class T>
struct MyMethodCall<T<std::string> > {
  static void call(T<std::string> object) {
    ...
  }
};

template <class T>
void myMethod(T & object) {
  MyMethodCall<T>::call(object);
}
于 2012-08-21T09:25:01.123 に答える
1

これはコンパイル可能な例です

template <class T>
class MyClass1{};

template <class T>
class MyClass2{};

template <template <typename> class T> 
void myMethod(T<std::string>& arg){}

int main()
{
MyClass1<std::string> c1;
myMethod(c1);
MyClass1<std::string> c2;
myMethod(c2);
}
于 2012-08-21T09:24:59.143 に答える