190

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

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

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

Foo me;

但我必须指定以下内容:

Foo<int> me;

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

4

5 回答 5

235

笔记:

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

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

你所要做的:

Foo<> me;

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

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

于 2013-03-12T22:53:22.867 回答
98

使用 C++17,您确实可以。

此功能称为类模板参数推导,并为您声明模板类型变量的方式增加了更多灵活性。

所以,

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

int main() {
    Foo f;
}

现在是合法的 C++ 代码

于 2018-06-21T14:26:01.327 回答
29

你不能这样做,但你可以这样做

typedef Foo<> Fooo;

然后做

Fooo me;
于 2015-11-18T10:34:28.473 回答
21

您可以使用以下内容:

Foo<> me;

int成为您的模板参数。尖括号是必须的,不能省略。

于 2013-03-12T22:53:29.503 回答
0

根据C++17标准,必须传递模板参数。

但是,如果您仍然想要解决此问题,请#define像这样使用:

template <typename T>
class Foo{
};

#define IFoo Foo<int>

快速提醒

预处理器不利于调试。

于 2022-02-03T05:26:18.193 回答