gpt4 book ai didi

c++ - 模板函数中的默认模板需要空角括号 <>

转载 作者:行者123 更新时间:2023-12-05 00:43:01 25 4
gpt4 key购买 nike

gcc 11.2 can't seem编译这个:

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

但是 has no problem

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

这是编译器错误吗?

This question似乎表明它应该可以工作。

最佳答案

GCC 是对的。一个空的模板参数列表,<> function 模板允许省略([temp.arg.explicit]/4)。在其他情况下,通常需要模板参数列表来命名模板的特定特化,即使它是空的。请参阅 simple-template-id 的语法,[temp.names]/1 .

作为规则的有限异常(exception),如果类模板的名称​​没有模板参数列表出现在需要具体类型的上下文中,它被称为“占位符推断的类类型”,这仅允许在 [dcl.type.class.deduct] 中列出的特定上下文中使用.最常见的是变量声明,如 std::pair p("foo", 1)编译器将在哪里推断 std::pair<const char*, int>在 C++17 及更高版本中。

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

关于c++ - 模板函数中的默认模板需要空角括号 <>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71683140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com