Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数参数中缺少类型模板参数_C++_Class_Templates - Fatal编程技术网

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) {