我正在尝试将模板参数作为模板参数传递给模板方法。我的代码做了这样的事情:
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 :(得分:3)
不幸的是这段代码无法编译。
如果没有看到确切的错误消息,很难提供帮助,但我认为问题是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()作为模板方法,所以你必须说明它明确(上面的代码更新)。