2016-06-17 22 views
1

なぜ次のコードが間違っていますか?非型パラメータのテンプレート引数は式でなければなりません

template <typename T, int N> 
struct Vector { 
    T data[N]; 
}; 

struct Dynamic { 
}; 

template <typename T> 
struct Vector<T, Dynamic> { 
    T* data; 
}; 

私はVector<int, Dynamic> obj;でコードをインスタンス化しようとしましたが、それは

error: template argument for non-type template parameter must be an expression

なぜ働きませんでしたか?私は型を渡しており、それが有効なテンプレートの特殊化だと思っていました。

2つのテンプレートを使用し、Nを要求するテンプレートとDynamicとマークされていないテンプレートを使用するにはどうすればよいですか?

+0

プライマリテンプレートは 'int'を想定していますが、特殊化では' Dynamic'を提供しているので無効です。 – user2296177

+0

エラーメッセージに何が間違っているとは限りませんか? 'Dynamic'は式ではなく、型名です。これは 'int'の値ではありません。 –

+0

@KerrekSB大丈夫ですが、なぜ[this](http://coliru.stacked-crooked.com/a/0b131d123ca803a5)は動作しませんか?これはまったく無関係の別のテンプレートです – Dean

答えて

2
template <typename T, int N> 
struct Vector { 
    T data[N]; 
}; 

ここではあなたの主なテンプレートクラスで、Ttype、(int, short, class-type, etc)でなければなりません... Nは​​で、int種類(数)に評価される式でなければなりません。

struct Dynamic { 
}; 

template <typename T> 
struct Vector<T, Dynamic> { 
    T* data; 
}; 

はタイプです。ないintプライマリテンプレートクラスに基づいて、あなたの主なテンプレート


に指定されているように、あなただけのintVectorの第二のテンプレートパラメータを特化することができます。例えば。 Dynamicクラスであり、あなたの主なテンプレートがintを期待するので、あなたが専門VectorDynamicを使用することはできません

template <typename T> 
struct Vector<T, 1> { 
    T* data; 
}; 

template <typename T> 
struct Vector<T, 35> { 
    T* data; 
}; 

template <typename T> 
struct Vector<T, constExpressionThatReturnsAnInt> { 
    T* data; 
}; 

...etc 
3

。何が欲しいのは、おそらくのようなものです:

#include <limits> 

constexpr size_t Dynamic = std::numeric_limits<size_t>::max(); 

template <typename T, size_t N> 
struct Vector { 
    T data[N]; 
}; 

template <typename T> 
struct Vector<T, Dynamic> { 
    T* data; 
}; 

Vector<int, 10> static_array; 
Vector<int, Dynamic> dynamic_array; 

ここDynamic正しいタイプ(size_t)のconstexprあるので、あなたのテンプレートを特化することができます。サイズがstd::numeric_limits<size_t>::max()の静的配列を作成することはできません(これは問題ではありません)。

関連する問題