2012-12-19 41 views
5

好吧,我讀throught頗有些「不能推導出模板參數」問題,但沒有一個似乎符合我的情況 - 或者我不明白的答案...嵌套模板推導模板參數失敗

one,我感覺朝着正確的方向發展,但是我沒能解決我的問題。

在我的頭中的精簡代碼如下所示:

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); 
} 

我實例是這樣的:

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

從VS2012我得到的消息:

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 

的當我將兩個struct s作爲移出class時也會發生錯誤建議。

+1

實例化代碼和錯誤消息是完全無關的。這個錯誤提到'StaticCast ',但是你的實例代碼中沒有任何地方。 – Xeo

+0

http://liveworkspace.org/code/4psoUf$0編譯得很好......你的代碼(在更正之前)是不可編譯的。 – ForEveR

+0

@Xeo:StaticCast從底部開始使用3行。 – primfaktor

回答

4

編譯器錯誤對指示實際問題沒有多大幫助。

實際的問題是,按值傳遞UnaryFunction<Tin, T>Init功能(和一個構造函數),但在一個抽象類UnaryFunction<>結果所有實例(不能按值傳遞)。 的簡單的解決方案是使用用於UnaryFunction通過按引用,以便mapper指的是在傳遞的實際對象

在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