1

私は enable_if をいじっていましたが、一貫性のない動作に出くわしたようです。これはVS2010にあります。次のサンプルに縮小しました。

#include <type_traits>

using namespace std;

// enable_if in initial template definition
template <class T, class Enable = enable_if<true>> struct foo {};

foo<int> a; //OK

// explicit specialisation
template <class T, class Enable = void> struct bar;
template <class T> struct bar<T, void> {};

bar<int> b; //OK

// enable_if based specialisation
template <class T, class Enable = void> struct baz;
template <class T> struct baz<T, std::enable_if<true>> {};

baz<int> c; //error C2079: 'c' uses undefined struct 'baz<T>'

これはコードまたはコンパイラのバグですか?

4

2 に答える 2

6

std::enable_if<true>する必要がありますtypename std::enable_if<true>::type

std::enable_if<true>常にタイプに名前を付けます( のようにstd::enable_if<false>)。条件が false の場合に置換を失敗させるには、typeネストされた typedef を使用する必要があります。これは、条件が true の場合にのみ定義されます。

于 2011-09-27T05:39:04.607 に答える
3

あなたの問題はほとんど関係ありませんenable_if

// you declare a structure named baz which takes 2 template parameters, with void
// as the default value of the second one.
template <class T, class Enable = void> struct baz;
// Partial specialization for a baz with T and an std::enable_if<true>
template <class T> struct baz<T, std::enable_if<true>> {};

// Declare a baz<int, void> (remember the default parameter?):
baz<int> c; //error C2079: 'c' uses undefined struct 'baz<T>'

baz<int, void>その時点で不完全な型を持っています。なしでも同じ問題が発生しますenable_if

template <class T, class U = void>
struct S;

template <class T>
struct S<T, int>
{ };

S<double> s;

そして、James が言ったように、あなたの使い方はenable_if間違っています。 Boost のドキュメントenable_ifは、それを説明する素晴らしい仕事をしています。

于 2011-09-27T05:49:27.893 に答える