c ++强制重载运算符的问题

时间:2014-08-03 05:10:38

标签: c++ templates casting operator-overloading

我有一个模板化的类,它上面定义了一个强制转换运算符。当我为operator+定义一个独立的重载时,这似乎没有按预期工作。

template <class TT>
class Mtx
{
private:
    MtxView<TT> m_view;
public:
    operator const MtxView<TT> &() const { return m_view; }
    operator MtxView<TT>() { return m_view; }
    ...
};

template <class TT> Mtx<TT> operator+(const MtxView<TT> &m1, const MtxView<TT> &m2) 
{...}

在下面的测试代码中,我遇到编译错误,因为使用了&#39; +&#39;这是&#34;二进制表达式的操作数无效。&#34;我本以为铸造操作员会允许它工作。为什么这会失败?如何修复它(没有MtxView的子类化?)

Mtx<float> m1, m2, m3;
...
m1 = m2 + m3;

1 个答案:

答案 0 :(得分:4)

g ++提供了更好的错误信息(OT:可能是第一次有人说过)

e.cc:22:10: note: candidate is:
e.cc:16:29: note: template<class TT> Mtx<TT> operator+(const MtxView<TT>&, const MtxView<TT>&)
     template <class TT> Mtx<TT> operator+(const MtxView<TT> &m1, const MtxView<TT> &m2)
                         ^
e.cc:16:29: note:   template argument deduction/substitution failed:
e.cc:22:12: note:   'Mtx<float>' is not derived from 'const MtxView<TT>'

m1 = m2 + m3;
          ^    

由于14.8.1 / 6:

,模板扣除失败
  

如果参数类型不包含参与模板参数推导的模板参数,则将对函数参数执行隐式转换(第4节)以将其转换为相应函数参数的类型

用简单的语言表示在执行函数模板TT的参数template<typename TT> U operator+(的推导时不考虑隐式转换运算符...

因此,编译器无法推断出TT应该是什么类型。

MM's solution(现已删除)有效,因为operator+没有功能模板; TT因为您正在调用Mtx<float>的成员函数而已为人所知。