模板函数中的默认模板需要空尖括号 <>

Rad*_*ich 3 c++ templates function-templates default-template-argument

gcc 11.2 似乎无法编译这个:

template <typename T = int>
struct Test {};
template <typename T> void foo(T& bar) {}
int main()
{
    Test t;
    foo<Test>(t);
}
Run Code Online (Sandbox Code Playgroud)

没有问题

template <typename T = int>
struct Test {};
template <typename T> void foo(T& bar) {}
int main()
{
    Test t;
    foo<Test<>>(t);
}
Run Code Online (Sandbox Code Playgroud)

这是编译器错误吗?

这个问题似乎表明它应该有效。

Bri*_*ian 7

海湾合作委员会是对的。<>对于函数模板,允许省略空模板参数列表( [temp.arg.explicit]/4)。在其他情况下,通常需要模板参数列表才能命名模板的特定专业化,即使它是空的。请参阅simple-template-id[temp.names]/1的语法。

作为该规则的有限例外,如果没有模板参数列表的类模板的名称出现在需要具体类型的上下文中,则它被称为“推导类类型的占位符”,并且仅在以下情况下允许这样做:[dcl.type.class.deduct]中列出的特定上下文。最常见的是变量声明,就像std::pair p("foo", 1)编译器在 C++17 及更高版本中推导的那样std::pair<const char*, int>

在您的代码中,您试图引用类 template 的特定特化Test,而不指定模板参数列表,并且不在可以推导模板参数的上下文中。因此,这是不允许的。