3

これは簡単な質問です。以前にも回答があったと思いますが、適切な回答が見つからないようです。

私はクラスを持っています、ポイント:

template<class T>
Point{
\\code
}

...そして今、ポイントのベクトルが必要です。そのうちのいくつかは T を整数として持ち、T を double として持ちます。のようなものを書きたい

template<class T>
std::vector<Point<T> > points;

しかし、残念ながら、これは「'template' の前にプライマリ式が必要です」というエラーでコンパイルされません。このコードをいじって動作させることができませんでした。また、ポイントはメイン クラスにあるため、関数の外側にテンプレート宣言を貼り付けることはできません。

誰かが私を解決策に導くことができれば、私は大いに義務付けられます.

ありがとう。

4

2 に答える 2

5

あなたの目標がvector両方を保持Point<int>することであり、 Boost VariantPoint<double>を使用できる場合。

typedef boost::variant<Point<int>, Point<double> > VariantPoint;

それで:

std::vector<VariantPoint> my_vector;

my_vector.push_back(Point<int>(1, 0));
my_vector.push_back(Point<double>(1.5f, 2.0f));

動作します。後で要素を検査するには、おそらくここに記載されているようにビジター パターンを使用する必要があることに注意してください。

の 1 つの型のみを保持できる個別のベクトル型を作成することが目標である場合はPoint、次を使用できます。

template<typename T> using PointVector = std::vector<Point<T>>; // C++11

// Now you can write:
PointVector<int> my_vector;

// Which is equivalent to:
std::vector<Point<int>> my_vector;

または、C++11 がオプションでない場合:

template<typename T> struct PointVector
{
  typedef std::vector<Point<T> > Type;
}

それで:

PointVector<int>::Type my_vector;
于 2012-06-12T07:18:13.563 に答える