【发布时间】:2013-02-28 17:01:45
【问题描述】:
如果允许我执行以下操作:
template <typename T = int>
class Foo{
};
为什么我不能在 main 中执行以下操作?
Foo me;
但我必须指定以下内容:
Foo<int> me;
C++11 引入了默认模板参数,现在我无法完全理解它们。
【问题讨论】:
如果允许我执行以下操作:
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() 会。参数语法必须仍然存在。这与那是一致的。
【讨论】:
Foo 可能是一个模板标识符或可能是一个明确的实例化,这取决于是否有一个默认参数。更好地保留显式实例化语法。把它想象成一个带有单个默认参数的函数foo。你不能像foo 这样称呼它,你可以用foo() 称呼它。保持这种一致性是有意义的。
foo 这样没有参数的函数;但是,您可以将不带参数的类命名为 Foo。
<> 在这种情况下不再需要。查看我的回答了解更多详情。
使用 C++17,确实可以。
此功能称为class template argument deduction,它为您声明模板类型的变量的方式增加了更多灵活性。
所以,
template <typename T = int>
class Foo{};
int main() {
Foo f;
}
现在是legal C++ code。
【讨论】:
你不能这样做,但你可以这样做
typedef Foo<> Fooo;
然后做
Fooo me;
【讨论】:
typedef Foo<float> Fooo;,没有默认类型有什么区别吗?
using Fooo = Foo<>;
您可以使用以下内容:
Foo<> me;
并让int 成为您的模板参数。尖括号是必须的,不能省略。
【讨论】:
根据C++17 标准,必须传递模板参数。
但如果您仍然想解决这个问题,请像这样使用#define:
template <typename T>
class Foo{
};
#define IFoo Foo<int>
快速提醒
预处理器不利于调试。
【讨论】:
using IFoo=Foo<int> 更糟糕。宏的忽略命名空间