2011-04-08 4 views
1

저는 G ++에서 작동하지만 Visual Studo 2008에서는 컴파일되지 않습니다.연산자가있는 호기심 반복 템플릿

template<typename T, typename DerivedT > 
struct Foo 
{  
    template<typename Scale> 
    DerivedT operator * (const Scale i) 
    { 
    DerivedT result; 
    return result; 
    } 
}; 

template<typename T> 
struct Bar : public Foo<T, Bar<T> > 
{ 
    // Removing this operator gets rid of the error. 
    Bar& operator * (const Bar& boo) 
    { 
    return *this; 
    } 
}; 

int main() 
{ 
    Bar<float> bar; 
    bar = bar * 3; 

    return 0; 
} 

나는 내가 INT/더블로 푸 연산자를 정의하는 경우에도 오류를

Error 1 error C2679: binary '*' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion) 

를 얻을 수 /이 같은 오류 메시지를 반환 명시 적으로 부동. 이 과거를 지나치는 방법이 있습니까?

편집 : 파생 클래스가 기본 클래스에서 정의 된 연산자 *를 오버로드하는 경우에만 해체됩니다.

+1

사례 연구보기 또는 도움을 드릴 수 없습니다. – Puppy

+0

@DeadMG 이것은 내 테스트 케이스이며, 그냥 다듬은 것입니다. 누락 된 정보 중 일부를 채웠습니다 –

답변

4

g ++로 컴파일하는 방법을 모르겠다. (사실 나는 그럴 생각이있다.) 그러나 코드는 오히려 명백한 이유로 편집 할 수 없다. 귀하의 Bar 클래스는 하나의 operator *

Bar& operator * (const Bar& boo) 

노출하고 연산자는 오른쪽 크기 피연산자로 Bar 객체를 기대하고있다. 3은 작동하지 않으며 3Bar이 아니며 Bar으로 변환 할 수 없습니다.

기본 클래스의 operator *은 여기서 작동했을 수도 있지만 파생 클래스 연산자에 의해 숨겨집니다. 따라서 예상되는 것처럼 파생 클래스의 operator *을 제거하면 오류가 제거됩니다.

당신은 단순히 기본 클래스의 연산자를 숨기기를 취소 할 Bar의 정의에

using Foo<T, Bar<T> >::operator *; 

을 추가 할 수 있으며 컴파일해야한다.

+0

+1, 답변과 같습니다. –

+0

@AndreyT와 @Johannes : 그는'Foo' 클래스에서'DerivedT '를 어떻게 사용할 수 있습니까? 그것의 불완전한 유형. 그것은 컴파일되지 않습니다. 그렇게 생각하지 않아? – Nawaz

+1

@Nawaz 멤버 함수 정의가 사용될 때까지 인스턴스화되지 않습니다. 선언 만 인스턴스화됩니다. 정의되지 않은 선언에서 불완전한 클래스를 리턴 타입으로 사용하는 것은 괜찮습니다 :'struct A; struct B {A 연산자 * (const float); };' –