私はg ++ 4.4と4.5で奇妙な問題を発見しました。私はこれについて尋ねました。なぜなら、私はコード内にばかげたエラーを作り出していると思ったからです。オリジナルのポストはhereですが、ポストcompletitudeのために私はここで問題に問題のあるコードを再投稿されます:私はいくつかのあいまいなルールを欠けている可能性がありますalthought本当にプログラマのエラーではないようですテンプレートテンプレートパラメータは、以前のパラメータから解決されたパラメータを受け取ることができますか?
$ cat templatetemplate.cc
template <int i>
struct LabelTypeMap { typedef int type_t; };
template <bool>
struct Hold { typedef int type; };
template<typename Holder, template<typename Holder::type> class typeMap>
struct Whatever { };
template <bool Enable>
struct Now { typedef Whatever<Hold<ENABLE>, LabelTypeMap> concrete_t; };
Now<true>::concrete_t obj;
$ g++ -DENABLE=Enable -c templatetemplate.cc
templatetemplate.cc:11: error: type/value mismatch at argument 2 in template parameter list for ‘template<class Holder, template<typename Holder::type <anonymous> > class typeMap> struct Whatever’
templatetemplate.cc:11: error: expected a template of type ↵
‘template<typename Holder::type <anonymous> > class typeMap’, got ↵
‘template<int i> struct LabelTypeMap’
[email protected]:~/play$
$ g++ -DENABLE=true -c templatetemplate.cc
(no error)
テンプレートテンプレートパラメータ解像度のしかし、私はバグをubuntuトラッカーに投稿しようとしました(うまくいけば彼らはそれを却下するか、そうでなければバグをアップストリームに送るでしょう)
これは本当にバグかどうかを調べるために、標準と私は今14.3.3セクションを2回読んだことがありますが、サンプルコードのようにパラメータを持つテンプレートテンプレートパラメータを渡すことが許されているのか許されていないのか分かりません。私はこの文書のこの部分がこれについて何も言及していないと確信していません
ここに私の質問があります。
EDIT:この質問が1週間以上未回答になっているのはかなり面白いです。私は、ISO C++標準では、前のテンプレートパラメータを使用して後続のテンプレートパラメータのタイプを指定できるかどうかはわかりません少なくとも記載された形式で)、基本的には実施者が決定するために残されています。
第2 EDIT(2011/01/01):皆さん、私たちはすべて欠けているかもしれませんコンパイラ設計者が間違っている): 私はintel C++コンパイラXE 12.0でこれを試しましたが、私はこれを得ました:
$icpc ttemplatetemplate.cc -o ./x2test
templatetemplate.cc(12): error: class template "LabelTypeMap" is not compatible with template template parameter "typeMap"
struct Now { typedef Whatever<Hold<Enable>, LabelTypeMap> concrete_t; };
^
compilation aborted for templatetemplate.cc (code 2)
$ icpc --version
icpc (ICC) 12.0.0 20101116
Copyright (C) 1985-2010 Intel Corporation. All rights reserved.
海賊版C++標準へのリンクを削除しました。 ISOがあなたに海賊のコピーにリンクしていることが判明した場合、私は彼らがあなたと何をするのか分かりません。「ISO IEC 14882 2003 C++」について、ISOカタログで見つけて... :) –
BTW、Clangはこのコードをうまくコンパイルします。そして、私はこれが無効であるという仕様を見ていない(私はそれが無効でなければならない理由は見当たらないが、その後はC++コンパイラの作成を試みたことがない)。だから私はこれが有効であると思っています。 –
信じられないほど、私はiso C++標準を「海賊行為」する可能性があるとは知らなかった。一般に公開されていない標準のポイントは何ですか? おとぎ話! - はい、私はclangを試してみましたが、それも私のために働くので、これは単なるg ++のバグです – lurscher