函数参数中缺少类型模板参数
Missing type template parameter in function argument
为什么以下方法有效
template<typename T> class example {
public:
T val;
example() {val=0;}
example operator+(example ob) {
example temp;
temp.val = val+ob.val;
return temp;
}
};
int main() {
example<int> a;
a+a;
return 0;
}
如果我没有看到它在编译,我会说操作员过载应该如下:
example<T> operator+(example<T> ob {
example<T> temp;
temp.val = val+ob.val;
return temp;
}
此外,我主要尝试更改以下内容:
example<int> a;
至:
example a;
但出现了一个错误,上面写着"…缺少模板参数…"我的猜测是,在类定义中,编译器将示例视为示例。但由于这只是一个猜测,我在任何地方都无法证实,所以我想在这里问一下。
是的,当您在模板定义内部时,可以省略模板参数(但例如,不在main中,因为它在模板定义之外(。
如果省略,参数将替换为当前实例化的参数。即,当您将模板实例化为example<int>
时,出于该实例化的目的,模板定义中所有没有模板参数的example
都将被example<int>
替换。
来自标准(C++11,强调矿(:
(14.6.2.1/1(如果是,则名称是指当前实例化
--在类模板的定义中,类模板的嵌套类,类模板成员,或类模板嵌套类成员,类模板或嵌套类的注入类名(第9条(,
[…]
几节之后,标准给出了一个例子:
template <class T> class A {
A* p1; // A is the current instantiation
A<T>* p2; // A<T> is the current instantiation
/*...*/
};
这是因为injected-class-name
(来自9p2(:
类名被插入到声明它的作用域中在看到类名之后立即显示。类名也是插入到类本身的范围中;这被称为注入的类名。
从14.6.1p1:
与普通(非模板(类一样,类模板具有注入类名(第9条(。注入的类名可以用作模板名称或类型名称。当它与模板参数列表,作为模板的模板参数模板参数,或作为详细阐述了友元类模板声明的类型说明符,它引用类模板本身否则,相当于类的模板参数后面的模板名称包含在<>中的模板
注入的类名引用类本身内部的example<T>
,从而允许简写版本。
如果我正确理解你的问题,是的,在类定义中,你不需要让每个函数都成为类模板参数的模板。
事实上,如果必须在类之外定义函数,则需要如下所示。
template<typename T>
example<T> example<T>::operator+(example<T> ob) {
附言:您应该将论点更改为const example<T>& ob
,以减少不必要的副本。
- 扩展C++生成的代码的模板参数类型名称
- 如何在 c++ 中定义接受不同参数类型的函数向量?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- 将函数参数类型声明为 auto
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- 在 C++17 中调用具有不同参数类型的构造函数
- 具有先前参数类型匹配的参数包
- 我想知道为什么"std::unique_ptr<int> foo(新 int)"是合法的,因为"std::<int>unique_ptr"要求输入参数类型应该是"int"?
- 将可变参数类型列表的扩展打包为复杂类型的初始值设定项列表 - 合法吗?
- MSVC 错误:4 个重载中的任何一个都无法转换所有参数类型
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- 如何从第一个参数推断第二个参数类型?
- C++模板函数中,指定回调函子/lambda 的参数类型,同时仍允许内联?
- 如何用不同的参数类型和数字回调函数
- C++stoi:这两个重载都无法转换所有参数类型
- 为什么std::{container}::template不能推导其参数类型
- 为模板参数类型中的新对象分配内存
- 为指向成员模板参数的指针推导额外模板参数类型的紧凑方式
- 使用std::conditional中的模板来确定函数参数类型
- C++中的短参数类型