2016-01-24 105 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命令()作为模板方法,所以你必须明确声明它(上面的代码更新)。