模板向后兼容gcc 4.7

时间:2013-07-10 21:14:29

标签: c++ templates c++11 gcc4 gcc4.7

请使用以下代码段:

struct whatever {};

template < template <typename, typename> class FOX, typename bat>
struct wulf {};

template <typename A, typename B, typename C = whatever>
struct box;

template <typename A, typename B>
struct box<A, B, whatever> {};

template <typename A, typename B, typename C>
struct box : wulf<box, C> {};

int main(void)
{
return 0;
}

它在gcc 4.1.2下编译得很好,但在gcc 4.7.2下编译时产生以下错误:

main.cpp:14:25 error: type/value mismatch at argument 1 in template parameter list for 'template<template<class,class> class FOX, class bat> struct wulf'
main.cpp:14:25 error: expected a template of type 'template<class, class> FOX', got 'template<class A, class B, class C> struct box'

这是我看起来能够重现此错误的最小示例代码段,我不知道发生了什么。为什么代码被拒绝,是否有正确的方法可以在两者下编译?

2 个答案:

答案 0 :(得分:3)

您的wulf类模板接受一个带有两个类型参数的类模板作为其第一个模板模板参数。

在这里,您试图提供一个带有三个类型参数的类模板(box)作为相应的参数:

template <typename A, typename B, typename C>
struct box : wulf<box, C> {};
//                ^^^

这是非法的。如果为box类模板的第三个类型参数指定了默认类型参数,则无关紧要:模板参数的类型和数量必须完全匹配。

要解决此问题,请更改wulf类模板的定义,如下所示:

template < template <typename, typename, typename> class FOX, typename bat>
//                                       ^^^^^^^^
struct wulf {};

以下是live example,其中显示了使用上述修补程序编译的代码。

答案 1 :(得分:1)

使用C ++ 11,您可以通过将wulf更改为:

来解决问题
template < template <typename...> class FOX, typename bat>
struct wulf {};

虽然GCC 4.1不接受它但我害怕...


我有时会使用另一个技巧:为box添加包装类:

struct whatever {};

template < template <typename,typename> class FOX, typename bat>
struct wulf {};

template <typename A, typename B, typename C = whatever>
struct box;

template <typename A, typename B>
struct box<A, B, whatever> {};

template <typename A, typename B>
struct box2 : box<A, B> {};

template <typename A, typename B, typename C>
struct box : wulf<box2, C> {};

int main(void)
{
    return 0;
}

我不知道这是否(在box中失去wulf的第三个参数)在你的案例中是一个问题,但我过去曾有一些使用这种技术帮助的用例。