今日、私は今まで見たことのない2つのエラーメッセージに出くわしました。それは私にとって全く新しいことです。
コードは次のとおりです。
template<typename T>
struct adder { adder(const T &item) { } };
template<typename T>
void initializer(const T &item) { adder<T>(item); }
int main()
{
initializer("const string literal");
}
コンパイル時に、GCCは次のエラーを出します。
prog.cpp:関数内'void initializer(const T&)':
prog.cpp:6:エラー:'adder <T>アイテム'の宣言がパラメータをシャドウします
prog.cpp:関数内' void initializer(const T&)[with T = char [21]]':
prog.cpp:10:ここからインスタンス化
prog.cpp:6:エラー:' adder <char [21]> item'の宣言がパラメーターをシャドウします
prog.cpp:6:エラー:いいえ'adder <char [21]> :: adder()' </ strong>
prog.cpp:3:注:候補は次のとおりです:adder <T> :: adder(const T&)[with T = char [21]]
prog.cpp:3:注:adder <char [21]> :: adder(const adder <char [21]>&)
太字のテキストを参照してください。1つのエラーが2回表示されます。これは
エラー:'<strong> adder <T> item 'の宣言がパラメーターをシャドウします
エラー:' adder <char [21]>item 'の宣言がパラメーターをシャドウします
どういう意味ですか?異なるテンプレート引数で2回表示されるのはなぜですか?最初のものはT
、2番目のものはchar [21]
?
編集:名前アイテムadder<T>(item)
で変数を宣言しますか?しかし、それは私が意図したものではありません。コンストラクターへの引数としてアイテムを渡す一時オブジェクトを作成する必要があると思います。
この問題を扱っている規格のセクションを知りたいです!
他の興味深いエラーはこれです:
エラー:'adder <char [21]> :: adder()'</p>の呼び出しに一致する関数がありません
これは、コンパイラがデフォルトのコンストラクタを探していることを示していますか?しかし、実際には私のコードが6行目でそれを使用していないのに、なぜコンパイラがそれを探しているのか疑問に思っています。
ideoneのコード:http ://www.ideone.com/jrdLL