以下のコードは、gcc 7.1.0でコンパイルできません。これは、mainの2行目に間違った数のテンプレート引数を指定していると文句を言います。 GCCのこのバージョンは、supposed to implementクラステンプレートのテンプレート引数の控除です。末尾のクラスのテンプレート引数が導出されない
私は、コンパイラは私が明示的に引数(Bar<int, int>
)の両方を指定する必要はありませんことを意味バーのクラステンプレート引数T2、言うC++17 draftの与えられた段落17.8.1.3を推定することができるはずだと思います」推論可能なテンプレート引数(17.8.2)またはデフォルトのテンプレート引数から得られるテンプレート引数は、明示的なテンプレート引数のリストから省略することができます。
私は間違っていますか?コンパイラが間違っていますか?これは見落としや意図的なデザインですか?
template <typename T>
struct Foo {
Foo(T t) {}
};
template <typename T1, typename T2>
struct Bar {
Bar(T2 t) {}
};
template <typename T1, typename T2>
void bar(T2 t) {}
int main(int argc, char **argv) {
Foo(42); // Works
Bar<int>(42); // Fails to compile with "wrong number of
// template arguments (1, should be 2)"
bar<int>(42); // Works
}
回答とドキュメントへのリンクありがとうございます。私はまだこれがなぜその理由であるかに興味があります。なぜこれが意図的に防止されるのかはわかりませんので、将来のバージョンの言語でこれが可能かどうかは疑問です。 – tweej
これのサポートは、将来のバージョンの言語で提案される予定です。 #CppCon2017 – tweej