gpt4 book ai didi

c++ - 函数参数中缺少类型模板参数

转载 作者:行者123 更新时间:2023-11-30 01:24:00 25 4
gpt4 key购买 nike

为什么以下内容有效?:

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;
}

此外,我尝试在 main 中更改以下内容:

example<int> a;

到:

example a;

但出现错误“...缺少模板参数...”我的猜测是在类定义中,编译器将示例视为示例。但由于这只是一个猜测,我无法在任何地方证实,所以我想在这里问一下。

最佳答案

是的,当您在模板定义内时可以省略模板参数(但是,例如,不在 main 中,因为它在模板定义之外)。

省略时,参数将替换为当前实例化 的参数。 IE。当您将模板实例化为 example<int> , 所有出现的 example没有模板参数在模板定义中将被替换为example<int>为了该实例化的目的。

来自标准(C++11,强调我的):

(14.6.2.1/1) A name refers to the current instantiation if it is

in the definition of a class template, a nested class of a class template, a member of a class template, or a member of a nested class of a class template, the injected-class-name (Clause 9) of the class template or nested class,
[...]

几节后,标准给出了一个例子:

template <class T> class A {
A* p1; // A is the current instantiation
A<T>* p2; // A<T> is the current instantiation

/*...*/
};

关于c++ - 函数参数中缺少类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14227721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com