2013-08-28 2 views
0

두 개의 정수를 사용하는 함수 템플릿 집합이 있습니다. 함수 인수 중 하나를 변환해야한다는 점을 제외하면 이들은 인스턴스화해야합니다. 이러한 목적으로 변환 연산자가 제공됩니다. 그러나 컴파일러 (VS 2013 익스프레스 미리보기)는 변환 가능성을 인식하지 않습니다. 아래 코드를 참조하십시오. conversion_op.h conversion_op.cpp에서함수 템플릿이있는 상태에서 인수 변환

template<int N> 
class Proxy 
{ 
}; 

template<int M, int N> 
void func(const Proxy<M>& p1, const Proxy<N>& p2) 
{ 
} 

typedef Proxy<1> SpecialProxy; 

class Orig 
{ 
    SpecialProxy P; 

public: 
    operator SpecialProxy() const 
    { 
     return P; 
    } 
}; 

에서

#include "conversion_op.h" 

//template void func(const SpecialProxy&, const SpecialProxy&); 
//template void func(const SpecialProxy&, const Proxy<2>&); 
//template void func(const Proxy<2>&, const SpecialProxy&); 
//template void func(const Proxy<2>&, const Proxy<2>&); 

int Test() 
{ 
    Orig a; 

    SpecialProxy p1; 
    Proxy<2> p2; 

    func<1,1>(a, p1); //OK 
    func<1,2>(a, p2); //OK 
    func<1,1>(p1, a); //OK 
    func<2,1>(p2, a); //OK 

    func(a, p1); //Error 
    func(a, p2); //Error 
    func(p1, a); //Error 
    func(p2, a); //Error 
} 

오류는 다음과 같습니다. 는 " '원래 값'에서 'const를 프록시 &'에 대한 템플릿 인수를 추론 할 수없는 참조하시기 바랍니다 func 선언. "

나는

operator const SpecialProxy&() const; 

에 의해

operator SpecialProxy() const; 

를 교체하려했지만 오류가 동일하게 유지됩니다.

또한 필요한 기능을 명시 적으로 시도 (conversion_op.cpp에서 주석 처리 된 코드)했지만 운이 없었습니다.

모든 의견에 감사드립니다. 감사합니다.

+0

아직 해결책을 찾지 못했습니다. 아무도 도와 줄 수 있어요. 고맙습니다. – skm

답변

1

여기서 문제는 C++ does not allow implicit conversion when deducing template arguments입니다. > 1이지만 M에 대한 값을 가지지 않으며 Orig에서 정의한대로 Proxy<1>a의 암시 적 변환 밖으로를 추론에게 그것을 허용 -

컴파일러 인스턴스 func(a, p1) 인스턴스화하려고

, 그것은 즉시 N을 추론 할 수있다.

+0

감사합니다. 이것이 암시 적 변환을 원한다면 원하는 모든 유형에 대해 명시 적 오버로드를 작성해야한다는 의미입니까? 즉, 함수 템플릿이 암시 적 변환과 어떤 방식으로도 "상호 작용"한다고 기대할 수는 없습니까? – skm

+0

@skm 불행히도 C++ 11은 그렇지 않습니다. – brunocodutra