这是遗留代码,可能适用于时代3.2或2.8 g ++,但不再适用。它仍然在microsoft C / C ++优化编译器v.17下编译。该代码也已从原始代码中删除,以隔离显着问题。
in function + =,error:' to_every'未在此范围内声明
class Matrix {};
class ElementWiseConst
{
public:
ElementWiseConst(const Matrix& m){}
};
class ElementWise : public ElementWiseConst
{
public:
ElementWise(const ElementWise&);
ElementWise(Matrix& m) : ElementWiseConst(m) {}
void operator += (const double val);
friend ElementWise to_every(Matrix& m) { return m; }
};
Matrix& operator += (Matrix& m, const double val) {
to_every(m) += val;
return m;
}
这是微软错误允许的隐式转换或作用域吗?
答案 0 :(得分:1)
to_every
在ElementWise
内定义,因此只能通过ADL找到。编译器将查看提供的参数并使用其关联的命名空间和类来查找名称to_every
。 Matrix
的关联类本身是Matrix
,其关联的命名空间是全局命名空间(假设它在那里被声明)。 ElementWise
需要是关联的类,因此无法找到to_every
。
要实现这一目标,您可以:
在课堂外定义to_every
。
通过将ElementWise
设为模板参数(@sehe)来使template<class T>
class ADLMatrix {};
using Matrix = ADLMatrix<class ElementWise>;
成为关联类:
{{1}}