C ++中的朋友名称解析范围

时间:2015-03-02 16:29:43

标签: c++ g++

这是遗留代码,可能适用于时代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; 
}

这是微软错误允许的隐式转换或作用域吗?

1 个答案:

答案 0 :(得分:1)

to_everyElementWise内定义,因此只能通过ADL找到。编译器将查看提供的参数并使用其关联的命名空间和类来查找名称to_everyMatrix的关联类本身是Matrix,其关联的命名空间是全局命名空间(假设它在那里被声明)。 ElementWise需要是关联的类,因此无法找到to_every

要实现这一目标,您可以:

  • 在课堂外定义to_every

  • 通过将ElementWise设为模板参数(@sehe)来使template<class T> class ADLMatrix {}; using Matrix = ADLMatrix<class ElementWise>; 成为关联类:

    {{1}}