如果允许我执行以下操作:
template <typename T = int>
class Foo{
};
为什么我不允许在 main 中执行以下操作?
Foo me;
但我必须指定以下内容:
Foo<int> me;
C++11 引入了默认模板参数,现在我完全无法理解它们。
笔记:
Foo me;
从 C++17 开始,没有模板参数是合法的。请参阅此答案:https ://stackoverflow.com/a/50970942/539997 。
适用于 C++17 之前的原始答案:
你所要做的:
Foo<> me;
模板参数必须存在,但您可以将它们留空。
把它想象成一个foo
只有一个默认参数的函数。该表达式foo
不会调用它,但foo()
会调用它。参数语法必须仍然存在。这与那是一致的。
使用 C++17,您确实可以。
此功能称为类模板参数推导,并为您声明模板类型变量的方式增加了更多灵活性。
所以,
template <typename T = int>
class Foo{};
int main() {
Foo f;
}
现在是合法的 C++ 代码。
你不能这样做,但你可以这样做
typedef Foo<> Fooo;
然后做
Fooo me;
您可以使用以下内容:
Foo<> me;
并int
成为您的模板参数。尖括号是必须的,不能省略。
根据C++17
标准,必须传递模板参数。
但是,如果您仍然想要解决此问题,请#define
像这样使用:
template <typename T>
class Foo{
};
#define IFoo Foo<int>
快速提醒
预处理器不利于调试。