首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >重载模板类的运算符时的隐式转换

重载模板类的运算符时的隐式转换
EN

Stack Overflow用户
提问于 2012-01-17 13:20:35
回答 1查看 4.7K关注 0票数 21

我想知道为什么隐式类型转换不适用于类模板上的外部操作符重载。以下是工作的非模板化版本:

代码语言:javascript
复制
class foo
{
public:

    foo() = default;

    foo(int that)
    {}

    foo& operator +=(foo rhs)
    {
        return *this;
    }
};

foo operator +(foo lhs, foo rhs)
{
    lhs += rhs;
    return lhs;
}

正如预期的那样,以下代码行可以正确编译:

代码语言:javascript
复制
foo f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // OK
f = 5 + f; // OK

另一方面,当类foo被声明为一个简单的模板时,如下所示:

代码语言:javascript
复制
template< typename T >
class foo
{
public:

    foo() = default;

    foo(int that)
    {}

    foo& operator +=(foo rhs)
    {
        return *this;
    }
};

template< typename T >
foo< T > operator +(foo< T > lhs, foo< T > rhs)
{
    lhs += rhs;
    return lhs;
}

以下代码行编译时出现错误:

代码语言:javascript
复制
foo< int > f, g;
f = f + g; // OK
f += 5; // OK
f = f + 5; // Error (no match for operator+)
f = 5 + f; // Error (no match for operator+)

我想要理解为什么编译器(GCC 4.6.2)不能使用类的模板版本的转换构造函数执行隐式类型转换。这是预期的行为吗?除了手动创建所有必要的重载外,是否有解决此问题的方法?

EN

回答 1

Stack Overflow用户

发布于 2012-01-17 13:32:43

所有可能的foo<T>都是来自int的同样有效的转换,因为构造函数接受int,而不是模板类型。编译器不能使用运算符中的另一个参数来猜测您想要的是哪一个,因此您会得到错误。如果你明确地告诉它你想要哪个实例化,我相信它会工作的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8890051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档