2012-12-19 3 views
5

확인 실패, 나는 축복하는 읽고 꽤 질문에 "템플릿 인수를 추론 할 수 없습니다"하지만 아무도 내 경우에 맞는 것 같다 - ...추론 템플릿 인수가

또는 내가 대답을 이해하지 못하는 one가 있다는 것을 I 기분이 올바른 방향으로 가고 있지만 문제 해결을 위해 솔루션을 추출하지 못했습니다.

내 헤더의 옷을 벗었 코드는 다음과 같습니다

template<typename T> 
class TemplateProblem 
{ 
public: 
    // Do I really need this or did I miss something from the STL? 
    template<typename Tin, typename Tout> 
    struct UnaryFunction : public std::unary_function<Tin, Tout> 
    { 
     virtual Tout operator()(Tin input) = 0; 
    }; 

    template<typename Tin, typename Tout> 
    struct StaticCast : public UnaryFunction<Tin, Tout> 
    { 
     virtual Tout operator()(Tin input) 
     { 
      return static_cast<Tout>(input); 
     } 
    }; 

private: 
    T * const _data; 
    T const _bias; 

    template<typename Tin> 
    void Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias); 

public: 
    template<typename Tin> 
    TemplateProblem(Tin * data, int length, Tin bias = Tin()); 

    template<typename Tin> 
    TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T()); 
}; 

template<typename T> 
template<typename Tin> 
void TemplateProblem<T>::Init(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias) 
{ 
    T mappedBias = mapper(bias); 
    for (int i = 0; i < length; i++) 
    { 
     _data[i] = data[i] + mappedBias; 
    } 
} 

template<typename T> 
template<typename Tin> 
TemplateProblem<T>::TemplateProblem(Tin * data, int length, UnaryFunction<Tin, T> mapper, Tin bias = T()) 
    : _data(new T[length]), _bias(bias) 
{ 
    Init(data, length, mapper, bias); 
} 

template<typename T> 
template<typename Tin> 
TemplateProblem<T>::TemplateProblem(Tin * data, int length, Tin bias = T()) 
    : _data(new T[length]), _bias(bias) 
{ 
    StaticCast<Tin, T> cast; 
    Init(data, length, cast, bias); 
} 

내가 같이 인스턴스화 :

Error 1 error C2784: 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' : could not deduce template argument for 'TemplateProblem<T>::UnaryFunction<Tin,T>' from 'TemplateProblem<T>::StaticCast<Tin,Tout>' ...\templateproblem.h 62 1 TemplateProblem 
Error 2 error C2893: Failed to specialize function template 'void TemplateProblem<T>::Init(Tin *,int,TemplateProblem<T>::UnaryFunction<Tin,T>,Tin)' ...\templateproblem.h 62 1 TemplateProblem 

:

VS2012에서
unsigned char pixels[] = {23, 42, 65, 97}; 
TemplateProblem<int> tp(pixels, 4); 

나는이 메시지를 얻을 class에서 두 개의 struct을으로 이동하면 오류가 발생합니다.건의합니다.

+1

인스턴스화 코드와 오류 메시지는 완전히 관련이 없습니다. 이 에러는'StaticCast '에 관한 것이지만, 당신은 당신의 인스턴스 코드에서 아무 것도 가지고 있지 않습니다. – Xeo

+0

http://liveworkspace.org/code/4psoUf$0 잘 컴파일 ... 코드 (수정 전)가 컴파일 할 수 없습니다. – ForEveR

+0

@Xeo : StaticCast는 하단에서 3 줄 사용됩니다. – primfaktor

답변

4

컴파일러 오류는 실제 문제를 나타내는 데별로 도움이되지 않습니다.

실제 문제

당신이 당신의 Init 기능 (및 생성자 중 하나), 그러나 (값에 의해 전달 될 수 없습니다) 추상 클래스 UnaryFunction<> 결과의 모든 인스턴스 항목 값으로 UnaryFunction<Tin, T>을 통과한다는 것입니다. mapper 건네 실제 오브젝트를 참조하도록 쉬운 용액을 통과하여 참조 UnaryFunction를 들어 사용하는

펑를 흘리는 STL의 일반적인 솔루션은 다음과 같이, 별도 템플릿 인수를 사용하는 것이다. :

template<typename T> 
template<typename Tin, Tmapper> 
void TemplateProblem<T>::Init(Tin * data, int length, Tmapper mapper, Tin bias) 
{ 
    T mappedBias = mapper(bias); 
    for (int i = 0; i < length; i++) 
    { 
     _data[i] = data[i] + mappedBias; 
    } 
} 

그런 다음 당신은 UnaryFunctionL<> 기본 클래스를 필요가 없습니다. 호환되지 않는 mapper이 전달되면 함수 본문에서 사용될 때 진단됩니다.

+0

'Tmapper' 템플릿 인수가 작동합니다. * 및 *는 삶을 편하게 만듭니다. 고마워요! – primfaktor