2016-06-17 8 views
1

人々はgrepのような方法でコードを読んだり比較したりしないので、すぐにこれがTemplate argument for non-type parameter must be an expressionの複製ではなく、私がそれを読んだ後に考えた別のものであると言います。したがって、これを全体として読んで、クラス名を見るだけではありません。テンプレートのパラメータにテンプレートのオーバーロードが適用されないのはなぜですか?

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

struct Dynamic { 
}; 

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

私は、コンパイル時の整数を受け取るテンプレートと、タグとして使用する型を受け取るテンプレートの2つが必要です。

何らかの理由で2番目のテンプレートが最初のテンプレートの特殊化(または再定義?)として解釈されるため、これは機能しません。

なぜテンプレートはテンプレートパラメータよりも曖昧さがありませんか?このための論理的/コンパイルの理由は何ですか?

+0

あなたは尋ね続けることができますが、あなたが望む答えを得ることはできません:-S言語はあなたにそれをさせるものではありません。 –

+0

私はちょうど不思議です、これは再ポストのように見える場合はごめんなさい。テンプレートのオーバーロード(タイプやタイプ以外のパラメータタイプが異なる)が悪いアイデアになるのはなぜか分かりません。 – Dean

+0

確かに、これは良いアイデアを気にするウェブサイトではありません。 –

答えて

4

あなたの質問の点では、答えは「理由」です。すべての機能が言語の一部であるわけではありません。

あなたが達成しようとしているものに関しては、テンプレートの専門化を試みることができます(個人的には非型引数で使用していませんが、どうしてそれがうまくいかない理由が分かります)。

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

const int Dynamic = INT_MAX; 

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

うん、これはうまくいくが、なぜ私は 'typename、int'を受け入れるテンプレートと' typename、typename'という名前のテンプレートを持つことができないのか分からない。それらはかなり区別可能です – Dean

+2

私はそれが実装する優先順位になっていないことは不明です。 C++で多くの時間を費やすことは、あなたが本当にやりたいことをエミュレートしようとする回避策を探すために深刻な潜水になります。 – Mitch

4

これは言語の仕組みではないためです。それはそれほど簡単です!

テンプレートは一度定義され、後で任意に特殊化されます。彼らは "過負荷"セマンティクスを持っていません。

+0

提案がありますか?なぜそれが有益ではないのか分かりません。 – Dean

+2

@Dean:なぜそうなるのか分かりません。そのような提案書は自由に書いて提出してください。しかしどこにでも行くことは期待しないでください。 –

関連する問題