문제

다음 프로그램을 고려하십시오.

    namespace NS2 {
      class base { };

      template<typename T>
      int size(T& t) {
        std::cout << "size NS2 called!" << std::endl;
        return sizeof(t);
      } 
    };

    namespace NS1 {
      class X : NS2::base { };
    }

    namespace NS3 {
      template<typename T>
      int size(T& t) {
        std::cout << "size NS3 called!" << std::endl;
        return sizeof(t) + 1;
      }

      template<typename T>
      class tmpl 
      {
      public:
        void operator()() { size(*this); }
      };
    };

int main() +{
  NS3::tmpl<NS1::X> t;
  t();
  return 0;
}

내 컴파일러 (GCC 4.3.3)는 크기의 호출이 모호하기 때문에 프로그램을 컴파일하지 않습니다. 네임 스페이스 NS2는 클래스 TMPL의 크기 호출에 대한 Associate 네임 스페이스 세트에 추가 된 것으로 보입니다. ISI 표준에서 Koenig 조회에 관한 섹션을 읽은 후에도이 동작이 표준 일치하는지 확실하지 않습니다. 그게? NS3 접두사로 크기 통화를받지 않고이 행동을 해결하는 방법을 아는 사람이 있습니까?

미리 감사드립니다!

도움이 되었습니까?

해결책

템플릿 인수와 기본 클래스는 모두 ADL에 영향을 미치므로 GCC가 정확하다고 생각합니다. NS3은 현재 범위, X 템플릿 인수의 NS1, 템플릿 인수의 기본 클래스에서 NS2에서 나옵니다.

당신은 어떻게 든 명확하게 표현해야합니다. 가능하다면 하나 이상의 함수를 바꾸거나 sfinae를 사용하여 기능을 명확하게하는 것이 좋습니다.

(유사한 상황 : Boost :: Copyable은 실제로 "typedef noncopyable _ :: copyable copyable"입니다. 따라서 Boost 네임 스페이스가 그로부터 파생 된 ADL 유형 세트에 추가되지 않도록하십시오.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top