2013-08-01 3 views
1

다음에 대한 링커 오류가 발생하는 이유는 무엇입니까?템플릿 친구 함수 인스턴스화

template<typename T, typename U> 
class A { 
public: 
    class B; 
}; 

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2); 
}; 

template<typename T, typename U> 
bool operator==(const typename A<T, U>::B& b1, const typename A<T, U>::B& b2) { 
    return true; 
} 

int main() { 
    A<char, int>::B b1; 
    A<char, int>::B b2; 

    if (b1 == b2) { 
     return 0; 
    } else { 
     return 1; 
    } 
} 

내가 오류는 다음과 같습니다

Undefined symbols for architecture x86_64: 
    "operator==(A<char, int>::B const&, A<char, int>::B const&)", referenced from: 
     _main in test-qSCyyF.o 

답변

2

당신은 그것을 호출하고 있기 때문에 그것은 어떤 정의가 없습니다!

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2); 
}; 

A<T,U>::B 클래스의 템플릿이 아닌 친구 기능의 선언이다.

전화 번호가 (b1 == b2)이고 정의 된 템플릿 연산자와 일치하지만 더 이상 정의되지 않은 템플릿이 선호됩니다.

GCC도 -Wnon-template-friend

경고하는 경고를 준다 : 친구 선언 비 템플릿 함수 [선언 '(CONST :: B &가 CONST :: B &)가 불리언 연산자 ==를'- Wnon 템플릿 - 친구]
참고 :

를 해결하려면 (이 당신이 의도하지 않은 경우, < 함수 템플릿이 이미 선언되어 있는지 확인하고 추가> 여기에 함수 이름 후), 그것은을 제공 정의

template<typename T, typename U> 
class A<T, U>::B { 
    friend bool operator==(const B& b1, const B& b2) { 
     return true; 
    } 
}; 

템플릿 연산자를 제거하거나 템플릿 1 만 유지하십시오.

+0

그래서 ... 어떻게 수정합니까? = P – fumoboy007

+0

나는 그것이 obvius 일 거라고 생각했다 :) 나는 새롭게 할 것이다. – jrok

+0

그래서 클래스 외부에 정의 된 템플릿 기능을 친구 함수로 사용할 수 없습니까? – fumoboy007