函数参数中缺少类型模板参数

Missing type template parameter in function argument

本文关键字:参数 类型 函数      更新时间:2023-10-16

为什么以下方法有效

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,以减少不必要的副本。