2

采取以下代码片段:

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'

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

4

2 回答 2

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 {};

这是一个实时示例,显示了使用上述修复程序编译的代码。

于 2013-07-10T21:20:26.203 回答
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;
}

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

于 2013-07-10T21:27:24.800 回答