내가 코드를 컴파일했을 때이 발생한다고 생각했지만 그렇지 않습니다. 그래서 여기에있는 지역 표준 전문가 중 일부가 도움을 줄 수 있기를 바랍니다 .-). 여기에 무슨 일이 일어나고 있는지 설명하기 위해, 그래서잠재적 인 g ++ 템플릿 버그?
#include <iostream>
template <class T = int>
class A {
public:
class U {
};
public:
U f() const { return U(); }
};
// test either the work around or the code I want...
#ifndef USE_FIX
template <class T>
bool operator==(const typename A<T>::U &x, int y) {
return true;
}
#else
typedef A<int> AI;
bool operator==(const AI::U &x, int y) {
return true;
}
#endif
int main() {
A<int> a;
std::cout << (a.f() == 1) << std::endl;
}
:
나는 기본적으로이 유사한 몇 가지 코드가 있습니다. 클래스 (A
) 내부 클래스 (U
) 및 해당 내부 클래스 (f()
) 인스턴스를 반환 할 수있는 하나 이상의 멤버 함수가있는 템플릿이 있습니다.
그런 다음이 내부 형식을 다른 형식 (이 경우 int
)과 비교하는 operator==
함수를 만들려고합니다. 그러나이 형식은 중요하지 않습니다.
USE_FIX
가 하지 나는 다음과 같은 오류 얻을 정의 : 그냥 경우 사실, 내가 분명히이기 때문에, 이상하게 보인다
test.cc: In function 'int main()':
test.cc:27:25: error: no match for 'operator==' in 'a.A<T>::f [with T = int]() == 1'
(나는 생각한다)는 템플릿 operator==
규정이 포함되어야 컴파일러 (USE_FIX 사용)에 대한 약간의 작업을 수행하면 더 이상 오류가 발생하지 않습니다. 불행히도 "수정"은 일반적으로 템플릿의 특정 인스턴스에 대해서만 작동하지 않습니다.
예상대로 작동하나요? 아니면 단순히 허용되지 않습니까?
BTW : 문제가 있다면 gcc 4.5.2를 사용하고 있습니다.
단순히 허용되지 않습니다. 문제에 대해 더 많이 알고 있다면 적절한 재 설계를 제안 할 수 있습니다. –
+1 좋은 질문입니다. :-) – Nawaz
가능한 [C++ 템플릿의 메소드 유형에서 클래스 유형을 추론하는 방법] (http://stackoverflow.com/questions/3830491/how-to-deduce-class-type-from-method-type- in-c-templates) –