C++ 函数参数中缺少类型模板参数
为什么以下方法有效C++ 函数参数中缺少类型模板参数,c++,class,templates,C++,Class,Templates,为什么以下方法有效 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>
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;
}
但在说“…缺少模板参数…”时出错
我的猜测是,在类定义中,编译器将示例视为示例。但是,由于这只是一个猜测,我在任何地方都无法确认,所以我想在这里提问。是的,当您在模板定义内时,可以忽略模板参数(但是,例如,不是在main中,因为它在模板定义外) 省略时,参数将替换为当前实例化的参数。也就是说,当您将模板实例化为
example
时,出于该实例化的目的,模板定义中所有出现的example
而没有模板参数的情况都将替换为example
根据标准(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
/*...*/
};
模板类别A{
A*p1;//A是当前的实例化
A*p2;//A是当前的实例化
/*...*/
};
是的,当您位于模板定义内部时,可以省略模板参数(但例如,不在main中,因为它位于模板定义外部)
省略时,参数将替换为当前实例化的参数。也就是说,当您将模板实例化为example
时,出于该实例化的目的,模板定义中所有出现的example
而没有模板参数的情况都将替换为example
根据标准(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
/*...*/
};
模板类别A{
A*p1;//A是当前的实例化
A*p2;//A是当前的实例化
/*...*/
};
如果我正确理解了您的问题,是的,在类定义中,您不需要将每个函数都设置为类模板参数的模板
事实上,如果必须在类之外定义函数,则需要如下所示
template<typename T>
example<T> example<T>::operator+(example<T> ob) {
模板
示例::运算符+(示例ob){
p、 您应该将参数更改为
const example&ob
,以减少不必要的副本。如果我正确理解您的问题,是的,在类定义中,您不需要将每个函数都设置为类模板参数的模板
事实上,如果必须在类之外定义函数,则需要如下所示
template<typename T>
example<T> example<T>::operator+(example<T> ob) {
模板
示例::运算符+(示例ob){
p、 您应该将参数更改为
const-example&ob
,以减少不必要的副本。这是因为注入的类名(从9p2开始):
类名插入到声明它的作用域中
在看到类名之后。类名也是
插入到类本身的作用域中;这称为
注入类名称
从14.6.1p1开始:
与普通(非模板)类一样,类模板具有
注入的类名(第9条)。注入的类名可以用作
模板名或类型名。与
模板参数列表,作为模板的模板参数
模板参数,或作为
友元类模板声明的详细类型说明符,它
引用类模板本身。否则,它相当于
模板名称后跟类的模板参数
随附的模板。
注入的类名是指类本身内部的示例
,允许使用速记版本。这是因为注入的类名
(从9p2开始):
类名插入到声明它的作用域中
在看到类名之后。类名也是
插入到类本身的作用域中;这称为
注入类名称
从14.6.1p1开始:
与普通(非模板)类一样,类模板具有
注入的类名(第9条)。注入的类名可以用作
模板名或类型名。与
模板参数列表,作为模板的模板参数
模板参数,或作为
友元类模板声明的详细类型说明符,它
引用类模板本身。否则,它相当于
模板名称后跟类的模板参数
随附的模板。
注入的类名引用类本身内部的示例
,允许使用速记版本
template<typename T>
example<T> example<T>::operator+(example<T> ob) {