重载和模板组合

Overloading and Template Combined

本文关键字:组合 重载      更新时间:2023-10-16

下面的代码让我很困惑:

  1. 我期望operator+<int>给出编译时间错误,因为操作符重载要求至少一种非固有类型。如果我尝试int operator+(int i, int j),它会失败。但这并没有产生任何问题,为什么呢?

  2. 如果我调用2+3,它不调用operator+,我必须显式地执行operator+<int>吗?

  3. 有没有更好的方法,除了写operator+<int>调用我的operator+的定义?

  4. 有一个地方我可以参考,这解释得更好吗?

注意:我使用了"Sun c++ 5.10"

#include <iostream>
using namespace std;
template <typename T>
T operator+(T i, T j)
{
        return i+j;
}
int main()
{
        cout<<2+3;
        cout<<operator+<int>(2,3);
        cout<<endl;
}

输出如下,

bash-2.03$ ./a.out
55

我认为这个问题的答案是相对简单的:这是一个编译器错误!相关报价结束了。第6段开头,第一句(c++ 2011):

操作符函数要么是非静态成员函数,要么是非成员函数,并且至少有一个形参的类型是类、类的引用、枚举或枚举的引用。

我用当前版本的EDG前端、g++和clang++测试了你的代码,它们都正确地拒绝了代码。