Приведенный ниже код не может скомпилироваться с gcc 7.1.0, который жалуется на то, что неверно задает число аргументов шаблона во второй строке main. Эта версия GCC должна реализовывать аргумент шаблона для шаблонов классов.
Я думаю, что компилятор должен иметь возможность выводить аргумент шаблона класса T2 для Bar, что означает, что мне не нужно явно указывать оба аргумента (Bar<int, int>
), учитывая параграф 17.8.1.3 С++ 17 draft, который гласит: "Исходные аргументы шаблона, которые могут быть выведены (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
}