【发布时间】:2021-05-27 04:18:02
【问题描述】:
Foo 的参数具有默认值,因此在 main() 中我可以执行 Foo();创建一个 Foo ,它将具有默认的模板参数。但是我不能在模板参数中使用:
template <typename T = double, int a =2, int b = 3>
struct Foo {};
//cannot deduce template arguments for ‘Foo’ from ()
template <typename FooType = Foo()> // <-- Error
struct TemplatedStructTakingAFooType
{
};
int main()
{
Foo(); // Foo type is deduced to be default values, ie.,
//Foo<double, 2, 3>;
decltype(Foo()); // Compiler knows the type
}
在我的 Visual Studio 编译器中,它以红色突出显示表示错误的区域,但可以编译。在 C++17 下的 onlineGDB 上编译失败并出现上述错误。这是允许的吗?有什么理由不应该吗?
编辑:我意识到使用是多么愚蠢,因为 Foo() 不是一种类型,但 '= Foo' 和 '= decltype(Foo())' 也不起作用。
【问题讨论】:
-
@Someprogrammerdude 仍然无法在 OnlineGDB 上运行,我会尝试获取链接:onlinegdb.com/2uWTCJUIO
-
template <typename FooType = Foo<>()>工作 godbolt.org/z/PofM4Erx9 -
@JerryJeremiah 里面的括号是干什么的?我会理解
<typename FooType = Foo<>>但Foo<>()?显然它确实有效,但我不明白如何。 -
@JerryJeremiah 谢谢你让我走上正轨! :)
-
@Zebrafish Foo() 是一个不带参数并返回 Foo 的函数,而 int() 是一个不带参数并返回 int 的函数。两者都是类型 - 只是不是您正在寻找的类型。所以你可以使用 Foo 或 decltype(Foo()) 就像下面的答案建议的那样。