2016-01-24 106 views
-3

我試圖將模板參數作爲模板參數傳遞給模板方法。我的代碼是這樣的:將模板參數傳遞給模板方法

template<class FieldType, class FieldGetter> 
FieldType getField(const FieldGetter& getter, const Data& data) 
{ 
    return getter.getField<FieldType>(data); 
} 

不幸的是,這段代碼不能編譯。

編輯: 我的實際代碼使用上面的函數頂部的一些包裝函數。我現在明白使用包裝器會導致編譯失敗。我用你的代碼(謝謝!)爲了提供一個完整的例子。

#include <string> 

struct Data { 
    template <typename T> T get() const { 
     return T(); 
    } 
}; 
struct Getter { 
    template <typename T> T getField(const Data& data) const { 
     return data.get<T>(); 
    } 
}; 

template <typename FieldType, typename FieldGetter> 
FieldType getField_posix(const FieldGetter& getter, const Data& data) 
{ 
    return getter.getField<FieldType>(data); 
} 


template <typename FieldType, typename FieldGetter> 
FieldType getField(const FieldGetter& getter, const Data& data) 
{ 
#ifdef BUILD_OTHER 
    return getField_other<FieldType, FieldGetter>(getter, data); 
#else 
    return getField_posix<FieldType, FieldGetter>(getter, data); 
#endif 
} 

int main() { 
    Data data; 
    getField<int, Getter>(Getter(), data); 
    getField<std::string, Getter>(Getter(), data); 
} 

以上以下編譯錯誤結果代碼:

templateTest.cpp: In function ‘FieldType getField_posix(const FieldGetter&, const Data&)’: 
templateTest.cpp:17:37: error: expected primary-expression before ‘>’ token 
    return getter.getField<FieldType>(data); 
+0

不幸的是,這段代碼很糟糕。 – Puppy

+0

這不是很有建設性。爲什麼它很糟糕?爲什麼所有的降價?是的,如果OP發佈了一個[最小完整示例](http://stackoverflow.com/help/mcve)和錯誤消息,那會更好,但我們仍然可以提供建議和幫助。 – Sam

回答

3

Unfortunately this code doesn't compile.

很難幫助沒有看到確切的錯誤消息,但我認爲問題是,getter.getField()方法沒有標記如const

下面的代碼編譯完美的罰款:

#include <string> 

struct Data { 
    template <typename T> T get() const { 
     return T(); 
    } 
}; 
struct Getter { 
    template <typename T> T getField(const Data& data) const { 
     return data.get<T>(); 
    } 
}; 

template <typename FieldType, typename FieldGetter> 
FieldType getField_posix(const FieldGetter& getter, const Data& data) 
{ 
    return getter.template getField<FieldType>(data); 
} 

template <typename FieldType, typename FieldGetter> 
FieldType getField(const FieldGetter& getter, const Data& data) 
{ 
#ifdef BUILD_OTHER 
    return getField_other<FieldType, FieldGetter>(getter, data); 
#else 
    return getField_posix<FieldType, FieldGetter>(getter, data); 
#endif 
} 

int main() { 
    Data data; 
    getField<int, Getter>(Getter(), data); 
    getField<std::string, Getter>(Getter(), data); 
} 

更新:我沒有太多成模板代碼的規則,但是從錯誤消息,很明顯,編譯器沒有發現嵌套getfield命令()作爲模板方法,所以你必須明確聲明它(上面的代碼更新)。