2

同じ機能を持つ異なるタイプの異なるタイプのコンテナーを使用しようとしていますが、コンパイラーを納得させることができませんでした。ここに私が試したことのいくつかがあります:

#include <iostream>
#include <vector>
#include <list>
using namespace std;

// error: expected a qualified name after 'typename'
template<typename C<T>>
void func1() {
  C<T> c;
  c.push_back(new T);
}

// error: expected a qualified name after 'typename'
template<typename C<typename T>>
void func2() {
  C<T> c;
  c.push_back(new T);
}

// error: expected a qualified name after 'typename'
template<typename C<template <typename T>>>
void func3() {
  C<T> c;
  c.push_back(new T);
}

int main(int argc, char *argv[]) {
  func1<vector<int>>();
  func1<list<float>>();

  func2<vector<int>>();
  func2<list<float>>();

  func3<vector<int>>();
  func3<list<float>>();
  return 0;
}

これは C++ で可能ですか?

4

4 に答える 4

2

「テンプレートテンプレートパラメーター」について話していると思います。

テンプレート テンプレート パラメーターは、テンプレート クラスのみが許可される型テンプレート パラメーターの一種です。そのクラス テンプレートには、任意の種類のテンプレート パラメーターを含めることができます。例えば:

template<template<typename T , typename ALLOCATOR> class CONTAINER>
void func2()
{
    CONTAINER<T,ALLOCATOR> container;

    container.push_back( T() );
} 

int main()
{
    func2<std::vector<bool>>();
}

これは、テンプレート パラメーターとして渡したクラス テンプレートのテンプレート パラメーターを抽出する必要がある場合に便利です。
詳細については、この質問を確認してください。

一方、クリスが彼の答えで気付いたように、あなたの場合、型パラメーターを渡し、型value_typeにコンテナーの要素の型を取得するために使用されるメンバー type があると仮定する方が簡単です。

于 2013-08-30T21:15:22.477 に答える