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

1

C++11 を使用すると、次のように変更することで問題を解決できますwulf

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

GCC 4.1はそれを受け入れませんが、残念ながら...


私が時々使うもう 1 つのトリック: Add a wrapper class for 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これ ( withinの 3 番目の引数を失うこと) が問題であるかどうかはわかりませんがwulf、過去にこの手法が役立つユースケースがいくつかありました。

于 2013-07-10T21:27:24.800 に答える