C++ 命名空间、类成员ADL冲突 #包括 外部命名空间{ 结构A{ int-outer=42; friend void打印(常量和A,标准::ostream和os) {os

C++ 命名空间、类成员ADL冲突 #包括 外部命名空间{ 结构A{ int-outer=42; friend void打印(常量和A,标准::ostream和os) {os,c++,argument-dependent-lookup,friend-function,C++,Argument Dependent Lookup,Friend Function,我找到了可能的解决方案: #include <iostream> namespace outside { struct A { int outer = 42; }; void print(A const& a, std::ostream& os) { os << "outside::A " << a.outer << '\n'; } namespace inside { struct A : outsi

我找到了可能的解决方案:

#include <iostream>

namespace outside {
  struct A { int outer = 42; };
  void print(A const& a, std::ostream& os) 
  { os << "outside::A " << a.outer << '\n'; }

  namespace inside {
    struct A : outside::A { 
      void print(std::ostream& os) { } // Added for extra difficulty
      int inner = 24;
    };
    void print(A const& a, std::ostream& os) { 

      outside::print(a, os); // <- works
      os << " inside::A " << a.inner << '\n'; 
    }
  } // inside
} // outside

int main(int argc, char *argv[]) {
  outside::A a_outside;
  outside::inside::A a_inside;

  print(a_outside, std::cout);
  print(a_inside, std::cout);
}
你是说:

namespace outside {
  struct A { 
    int outer = 42; 

    friend void print(A const& a, std::ostream& os);
  };
  void print(A const& a, std::ostream& os) {
    os << "outside::A " << a.outer << '\n';
  }
  namespace inside {
    struct A : outside::A { 
      int inner = 24; 

      friend void print(A const& a, std::ostream& os);
    };
    void print(A const& a, std::ostream& os) { 
      outside::print(a, os);
      os << " inside::A " << a.inner << '\n'; 
    }
  } // inside
} // outside
friend void print(一个const&A,std::ostream&os){
//外部::A::打印(A,os);
打印(静态投影(a),操作系统);

操作系统这很好,也感谢链接。我添加了一个名字相同的成员,这有点不公平,它打败了静态强制转换…有什么想法吗?然后你需要使用第二个例子。你不能在类定义中使用ADL和friend函数,因为他首先找到成员函数(定义在同一范围内).ADL旨在解决来自不同名称空间的冲突,而不是来自同一类的冲突。或者更改该成员类的名称。
friend void print(A const& a, std::ostream& os) { 
    print(static_cast<const outside::A&>(a), os);
    os << " inside::A " << a.inner << '\n'; 
}
namespace outside {
  struct A { 
    int outer = 42; 

    friend void print(A const& a, std::ostream& os);
  };
  void print(A const& a, std::ostream& os) {
    os << "outside::A " << a.outer << '\n';
  }
  namespace inside {
    struct A : outside::A { 
      int inner = 24; 

      friend void print(A const& a, std::ostream& os);
    };
    void print(A const& a, std::ostream& os) { 
      outside::print(a, os);
      os << " inside::A " << a.inner << '\n'; 
    }
  } // inside
} // outside
  friend void print(A const& a, std::ostream& os) { 
    // outside::A::print(a, os);
    print(static_cast<const outside::A&>(a), os);
    os << " inside::A " << a.inner << '\n'; 
  }