我有一个模板化的类,它上面定义了一个强制转换运算符。当我为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;
答案 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>
的成员函数而已为人所知。