std::enable_if 专业化失败

发布于 2024-12-06 23:11:36 字数 720 浏览 0 评论 0原文

我一直在摆弄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>'

这是代码或编译器中的错误吗?

I've been messing around with enable_if, and I seem to have stumbled upon some inconsistent behaviour. This is in VS2010. I've reduced it to the following sample.

#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>'

Is this a bug in the code or the compiler?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

<逆流佳人身旁 2024-12-13 23:11:36

std::enable_if 应该是 typename std::enable_if::type

std::enable_if 始终命名类型(std::enable_if 也是如此)。为了在条件为 false 时使替换失败,您需要使用 type 嵌套 typedef,它仅在条件为 true 时定义。

std::enable_if<true> should be typename std::enable_if<true>::type.

std::enable_if<true> always names a type (as does std::enable_if<false>). In order to get substitution to fail when the condition is false you need to use the type nested typedef, which is only defined if the condition is true.

春风十里 2024-12-13 23:11:36

您的问题与 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 此时的类型不完整无关。如果没有 enable_if,也会出现同样的问题:

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

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

S<double> s;

而且,正如 James 所说,您错误地使用了 enable_ifBoost 的 enable_if 文档解释得很好。

Your problem has very little to do with 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> has an incomplete type at that point. The same problem will occur without enable_if:

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

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

S<double> s;

And, as James said, you're using enable_if incorrectly. Boost's documentation for enable_if does a great job explaining it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文