とvector
がstd
名前空間に存在するので、それは、std::vector
、何もないのだろうとstd::vector<int>
はもうテンプレートではありませんしながら、あなたは、テンプレートテンプレートパラメータを求めています。あなたが優れているので、
template <
typename T,
template<typename, typename> class ContainerType,
typename Alloc = std::allocator<T>
>
class Stack{
ContainerType<T, Alloc> container;
// ...
};
// usage:
Stack<int, std::vector> s;
は今、これが唯一の基になる型などの2つのテンプレートパラメータでコンテナを可能にします。次に、std::vector
は実際にテンプレートパラメータ、タイプ用とアロケータのために他を取りますノーマルタイプとしてそれを取る:標準が何をするかとオフ、あなたが偽の「静的アサート」を行うことができます基になる型が同じT
を持っていることを保証するために
template <typename T, typename ContainerType>
class Stack{
ContainerType container;
// ...
};
// usage:
Stack<int, std::vector<int> > s;
、またはあなたがCを持っている場合++ 0xを有効にしたコンパイラでは、実際の静的なアサートを行うことができます:
#include <tr1/type_traits> // C++03 us std::tr1::is_same
//#include <type_traits> // C++0x, use std::is_same
template <typename T, typename ContainerType>
class Stack{
typedef typename ContainerType::value_type underlying_value_type;
typedef char ERROR_different_value_type[
std::tr1::is_same<T, underlying_value_type>::value ? 1 : -1
]
ContainerType container;
// ...
};
T
が使用される容器のT
と異なる場合、それはtypedef char ERROR_different_vale_type[-1]
なり、負のサイズの配列はおそらく、コンパイラエラーが発生している、存在することができないので、これが動作します。 :)に今、あなたができるだけstatic_assert
そのC++ 0xで:便宜上
#include <tr1/type_traits> // C++03
//#include <type_traits> // C++0x
template <typename T, typename ContainerType>
class Stack{
typedef typename ContainerType::value_type underlying_value_type;
static_assert(std::tr1::is_same<T, underlying_value_type>::value,
"Error: The type of the stack must be the same as the type of the container");
ContainerType container;
// ...
};
、あなたは今、一般的な場合のデフォルトのテンプレート引数を指定することができます。
template <typename T, typename ContainerType = std::vector<T>>
class Stack{
ContainerType container;
// ...
};
// usage:
Stack<int> s;
そして、この時点であなたをちょうどこれを行うstd::stack
を使うことができます(ただし、基底型としてstd::deque
を使用しています)。:)
ベクトルはstdネームスペースにあります – nullpotent
このエラーは、常に 'using namespace std;'を書いて慣れていることの結果です。 –
@Armenしかし、実際のエラーは別の場所です。 –