我一直在搞乱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>'
这是代码或编译器中的错误吗?
答案 0 :(得分:6)
std::enable_if<true>
应为typename std::enable_if<true>::type
。
std::enable_if<true>
总是命名一个类型(std::enable_if<false>
也是如此)。为了在条件为假时使替换失败,您需要使用type
嵌套的typedef,仅在条件为真时才定义。
答案 1 :(得分: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's documentation for enable_if
很好地解释了它。