模板默认参数

新手上路,请多包涵

如果允许我执行以下操作:

 template <typename T = int>
class Foo{
};

为什么我不允许在 main 中执行以下操作?

 Foo me;

但我必须指定以下内容:

 Foo<int> me;

C++11 引入了默认模板参数,现在我完全无法理解它们。

原文由 user633658 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 396
2 个回答

笔记:

Foo me; 从 C++17 开始,没有模板参数是合法的。请参阅此答案: https ://stackoverflow.com/a/50970942/539997。

适用于 C++17 之前的原始答案:

你所要做的:

 Foo<> me;

模板参数必须存在,但您可以将它们留空。

把它想象成一个函数 foo 有一个默认参数。表达式 foo 不会调用它,但 foo() 会。参数语法必须仍然存在。这与那是一致的。

原文由 Joseph Mansfield 发布,翻译遵循 CC BY-SA 4.0 许可协议

稍有 不同的情况,但要晚一些,但涉及模板 _函数_。 gcc 11.2 似乎 无法编译:

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

没有问题

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

当然

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

有效- 但有时您需要明确强制类型。这是编译器错误吗?

原文由 Radrich 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题