무료 함수로 클래스 외부의 템플릿에 operator! =를 구현하는 올바른 방법

쉬라즈

파일에 내부 클래스가있는 다음 템플릿이 map.hpp있습니다.

template<typename Key_T, typename Mapped_T>
class Map {
    // public members of Map ...

    class Iterator {
        //public members of Iterator ...

        friend bool operator!=(const Iterator &i, const Iterator &j) {
            return (i.link != j.link);  
        }

        // private members of iterator ...
        Node * link;
    };
};
#include "map.hxx"   //implementation file for member methods is separate

에서 main.cpp나는 다음을 호출하고 지금까지 다 잘 작동합니다 :

Map<int, int> x;
// bunch of insertions ...
for (auto it = x.begin; it != x.end(); ++it) {
    // Do something with it ...   
}

그러나 친구 함수를 파일에서 다른 구현이 포함 된 파일 map.hpp이동하고 싶습니다 map.hxx.

Q : 무료 기능을 .hxx파일 로 이동할 수 있습니까?

Iterator 클래스에서 함수를 친구로 선언하는 데 지 쳤고 구현 파일에서 다음을 수행했습니다.

template<typename Key_T, typename Mapped_T>
bool operator!=(const typename Map<Key_T, Mapped_T>::Iterator & i,
                const typename Map<Key_T, Mapped_T>::Iterator & j) {
    return (i.link != j.link);
}

그러나 다음과 같이 실패했습니다.

$clang++ -std=c++11 -stdlib=libc++ -Wall -Wextra -g main.cpp 

Undefined symbols for architecture x86_64:
  "shiraz::operator!=(shiraz::Map<int, int>::Iterator const&, shiraz::Map<int, int>::Iterator const&)", referenced from:
      _main in main-3oCRAm.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

감사!

야크-아담 네 브라우 몽

friend해당 일치하지 않고 선언은 포함하는 네임 스페이스에 새로운 기능을 삽입합니다. 이 기능은 ADL을 통해서만 찾을 수 있습니다.

원하는 작업을 수행하는 가장 쉬운 방법은 iterator클래스에 스텁 구현을 남겨두고 외부 "실제"함수로 전달하는 것입니다. 이는 ADL 전용 조회를 유지하여 !=까다로운 과부하 문제를 쉽게 해결합니다. 도우미 함수는 단순히 a 일 template<class Iterator>수 있고 더 일반적으로 친구가 될 수 있으며 좁은 구현을 가질 수 있으며 ADL을 통해 찾을 수 없지만 정규화 된 조회를 통해 찾을 수 있습니다. 또는 둘러싸는 맵의 정적 멤버 함수일 수 있습니다.

template<typename Key_T, typename Mapped_T>
class Map {
  class Iterator;
  static bool it_equal( Iterator const&, Iterator const& );
  class Iterator {
    friend class Map;
    friend bool operator!=(const Iterator &i, const Iterator &j) {
      return !Map::it_equal(i,j);
    }
    friend bool operator==(const Iterator &i, const Iterator &j) {
      return Map::it_equal(i,j);
    }
    Node * link;
  };
};

이제 .hxx단순히 구현 bool Map<blah>::it_equal(blah)하고 완료되었습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

템플릿 클래스의 템플릿 함수를 함수 포인터로 바꾸는 방법

분류에서Dev

C ++에서 공변 템플릿 함수를 정의하는 올바른 방법

분류에서Dev

innter 클래스에서 외부 클래스의 템플릿 매개 변수를 참조하는 방법은 무엇입니까?

분류에서Dev

서로 다른 두 개체의 기본 클래스에서 템플릿 클래스를 사용하는 방법

분류에서Dev

Django 1.6 클래스 기반 뷰 : URL 템플릿 태그에서 올바른 경로 / to / view /를 얻는 방법

분류에서Dev

친구 함수를 사용하여 연산자 == 외부 템플릿 클래스를 오버로드하는 방법은 무엇입니까?

분류에서Dev

템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

분류에서Dev

현재 클래스 템플릿을 다른 템플릿의 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

분류에서Dev

외부 클래스에서 내부 클래스의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

클래스 템플릿 외부에서 클래스 템플릿의 생성자 템플릿을 정의하는 방법은 무엇입니까?

분류에서Dev

다른 템플릿 클래스의 내부 템플릿 클래스 생성자를 정의하는 방법은 무엇입니까?

분류에서Dev

두 개의 다른 템플릿에 ListView 클래스를 사용하는 방법

분류에서Dev

템플릿 클래스의 이름을 템플릿 인수에 전달하는 방법은 무엇입니까?

분류에서Dev

클래스 템플릿의 하위 클래스를 클래스 템플릿으로 만드는 방법은 무엇입니까?

분류에서Dev

포착 된 예외를 저장하고 시스템 종료 처리 목적으로 함수 외부에서 사용하는 올바른 방법은 무엇입니까?

분류에서Dev

JSDoc 3 구문으로 객체의 클래스를 지정하는 올바른 방법은 무엇입니까?

분류에서Dev

AsyncTask 클래스의 올바른 방법은 다른 AsyncTask 클래스가 프로세스를 완료하기를 기다리는 방법

분류에서Dev

Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

C ++ : 두 클래스에 다른 클래스를 가리키는 포인터가 포함 된 경우 파생 클래스 간의 템플릿 순환 종속성을 해결하는 방법은 무엇입니까?

분류에서Dev

typescript를 사용하여 Firebase 클라우드 함수 내에서 클래스를 동적으로 가져 오는 올바른 방법은 무엇입니까?

분류에서Dev

클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

분류에서Dev

다른 매개 변수에 따라 중첩 된 템플릿 클래스 인스턴스를 기본 템플릿 매개 변수로 설정하는 방법

분류에서Dev

템플릿 클래스 멤버의 라인 외부 정의에 enable_if를 사용하는 방법

분류에서Dev

템플릿 구조의 객체를 다른 템플릿 클래스의 멤버 함수로 전달

분류에서Dev

가변 클래스 템플릿의 멤버 템플릿 함수를 정의하는 방법

분류에서Dev

템플릿 클래스에서 연산자 오버로딩을 구현하는 방법은 무엇입니까?

분류에서Dev

템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법 (이미 지정됨)?

분류에서Dev

템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법은 무엇입니까?

분류에서Dev

비 변형 템플릿 클래스 내에서 가변 템플릿 함수를 형성하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    템플릿 클래스의 템플릿 함수를 함수 포인터로 바꾸는 방법

  2. 2

    C ++에서 공변 템플릿 함수를 정의하는 올바른 방법

  3. 3

    innter 클래스에서 외부 클래스의 템플릿 매개 변수를 참조하는 방법은 무엇입니까?

  4. 4

    서로 다른 두 개체의 기본 클래스에서 템플릿 클래스를 사용하는 방법

  5. 5

    Django 1.6 클래스 기반 뷰 : URL 템플릿 태그에서 올바른 경로 / to / view /를 얻는 방법

  6. 6

    친구 함수를 사용하여 연산자 == 외부 템플릿 클래스를 오버로드하는 방법은 무엇입니까?

  7. 7

    템플릿 클래스의 멤버 함수에 포인터를 전달하는 방법은 무엇입니까?

  8. 8

    현재 클래스 템플릿을 다른 템플릿의 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

  9. 9

    외부 클래스에서 내부 클래스의 함수를 호출하는 방법은 무엇입니까?

  10. 10

    클래스 템플릿 외부에서 클래스 템플릿의 생성자 템플릿을 정의하는 방법은 무엇입니까?

  11. 11

    다른 템플릿 클래스의 내부 템플릿 클래스 생성자를 정의하는 방법은 무엇입니까?

  12. 12

    두 개의 다른 템플릿에 ListView 클래스를 사용하는 방법

  13. 13

    템플릿 클래스의 이름을 템플릿 인수에 전달하는 방법은 무엇입니까?

  14. 14

    클래스 템플릿의 하위 클래스를 클래스 템플릿으로 만드는 방법은 무엇입니까?

  15. 15

    포착 된 예외를 저장하고 시스템 종료 처리 목적으로 함수 외부에서 사용하는 올바른 방법은 무엇입니까?

  16. 16

    JSDoc 3 구문으로 객체의 클래스를 지정하는 올바른 방법은 무엇입니까?

  17. 17

    AsyncTask 클래스의 올바른 방법은 다른 AsyncTask 클래스가 프로세스를 완료하기를 기다리는 방법

  18. 18

    Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

  19. 19

    C ++ : 두 클래스에 다른 클래스를 가리키는 포인터가 포함 된 경우 파생 클래스 간의 템플릿 순환 종속성을 해결하는 방법은 무엇입니까?

  20. 20

    typescript를 사용하여 Firebase 클라우드 함수 내에서 클래스를 동적으로 가져 오는 올바른 방법은 무엇입니까?

  21. 21

    클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

  22. 22

    다른 매개 변수에 따라 중첩 된 템플릿 클래스 인스턴스를 기본 템플릿 매개 변수로 설정하는 방법

  23. 23

    템플릿 클래스 멤버의 라인 외부 정의에 enable_if를 사용하는 방법

  24. 24

    템플릿 구조의 객체를 다른 템플릿 클래스의 멤버 함수로 전달

  25. 25

    가변 클래스 템플릿의 멤버 템플릿 함수를 정의하는 방법

  26. 26

    템플릿 클래스에서 연산자 오버로딩을 구현하는 방법은 무엇입니까?

  27. 27

    템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법 (이미 지정됨)?

  28. 28

    템플릿 클래스에서 템플릿 멤버 함수를 전문화하는 방법은 무엇입니까?

  29. 29

    비 변형 템플릿 클래스 내에서 가변 템플릿 함수를 형성하는 방법은 무엇입니까?

뜨겁다태그

보관