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>)。为了在条件为假时替换失败,您需要使用type嵌套的 typedef,它仅在条件为真时定义。

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

而且,正如詹姆斯所说,您使用enable_if不正确。 Boost 的文档enable_if很好地解释了它。

于 2011-09-27T05:49:27.893 回答