将模板参数传递给模板方法

时间:2016-01-24 22:40:05

标签: c++ templates

我正在尝试将模板参数作为模板参数传递给模板方法。我的代码做了这样的事情:

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

1 个答案:

答案 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()作为模板方法,所以你必须说明它明确(上面的代码更新)。