如果允许我执行以下操作:
template <typename T = int>
class Foo{
};
为什么我主要不被允许做以下事情?
Foo me;
但我必须具体说明以下几点:
Foo<int> me;
C11引入了默认的模板参数,现在我完全无法理解它们。
你不准那样做但你可以这样做
typedef Foo<> Fooo;
然后呢
Fooo me;
使用C17,您确实可以。
此功能称为类模板参数推断,为声明模板化类型变量的方式增加了更多灵活性。
所以
template <typename T = int>
class Foo{};
int main() {
Foo f;
}
现在是合法的C代码。
注:
foome
从C17起是合法的。看看这个答案:https://stackoverflow.com/a/50970942/539997.
C 17之前适用的原始答案:
你必须做到:
Foo<> me;
模板参数必须存在,但可以保留为空。
将其视为一个带有单个默认参数的函数
foo
。表达式foo
不会调用它,但是foo()
会调用它。参数语法必须仍然存在。这是一致的。
是否允许在友元声明中为模板参数提供默认值? Visual Studio 2015似乎允许这样做。gcc拒绝了。我在cppreference页面上找不到任何内容。
标准中似乎没有规则提到模板参数需要默认参数的情况。 在dcl中。fct。默认值#1 如果在参数声明中指定了初始化子句,则将此初始化子句用作默认参数。缺省参数将用于缺少尾随参数的调用。 在本节中,规则明确描述了何时为函数调用提供默认参数。但是,我在标准中没有找到与上面描述何时提供默认参数作为模板参数的语句类似的引用。 例如
我有一个程序如下。有一个基本模板,以及SFINAE的部分专业化。 在2运行程序时,将打印 中的
已编辑(原始问题只有int A,int B): 模板参数推断在两个专门化之间比较的#参数相同时按预期工作,但在它们不同时失败(因为在其中一个专门化中包含默认参数)。 例如:为什么模板参数推导在一种情况下与另一种情况下失败,有人能指出解释这一点的任何资源/标准吗? 错误:模糊模板实例化'类Foo
根据enable_if结构的定义: 我想知道怎么做 特别是: 在
函数模板、成员函数模板、或类模板的成员函数或静态数据成员的专门化可以在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于在翻译单元内具有实例化点的任何这样的专门化,翻译单元的末尾也被认为是实例化点。类模板的专门化在翻译单元中最多有一个实例化点。任何模板的专门化都可能在多个翻译单元中具有实例化点。如果两个不同的实例化点根据一个定义规则赋予一个模板专门化不同的含义,则程序是格式不良的,不需要诊