【发布时间】:2017-06-17 22:22:04
【问题描述】:
拜托,最聪明的 C++ type_traits 大师,谁能解释一下原因 此代码失败并显示错误 - 我正在分析最新的 C++-17 标准草案,看不出为什么会失败(在 Linux 上使用 gcc-5.4.0):
#include <type_traits>
struct a
{static
void f(void){}
};
struct b
{static
void f(void){}
};
struct c
{static
void f(void){}
};
struct abc
{static
void f(void){}
};
struct ab
{static
void f(void){}
};
struct ac
{static
void f(void){}
};
struct bc
{static
void f(void){}
};
struct d
{static
void f(void){}
};
struct e
{static
void f(void){}
};
#define C 3
typedef
std::conditional
<(C<8),
std::conditional
<C==7, abc,
std::conditional
<C==6, bc,
std::conditional
<C==5, ac,
std::conditional
<C==4, c,
std::conditional
<C==3, ab,
std::conditional
<C==2, b,
std::conditional
<C==1, a, d>>>>>>>,e
>::type T;
void f(void)
{ T::f();
}
代码无法编译:
$ g++ -I. -std=gnu++17 -g -O2 -mtune=native -fPIC -pipe -pthread
-D_REENTRANT -Wall -Wextra -Wno-unused -fno-pretty-templates -c /tmp/T.C
-o /dev/null
/tmp/T.C: In function 'void f()':
/tmp/T.C:62:3: error: 'f' is not a member of 'T {aka
std::conditional<false, abc, std::conditional<false, bc,
std::conditional<false, ac, std::conditional<false, c,
std::conditional<true, ab, std::conditional<false, b,
std::conditional<false, a, d> > > > > > >}'
{ T::f();
^
我的目标是调用不同类的 f() 函数 在“C”#define 中低 3 位的每个唯一组合上 (或枚举成员)。 我认为上面的意思是 std::conditional 的意思。 请注意,即使 'ab' 的条件为真,也找不到 'ab::f()'。 为什么 ?
【问题讨论】:
-
你能不能让代码更不可读?
-
@NeilButterworth:感谢您的回复,但请坚持使用有用的 cmets - 我想我试图使代码尽可能简单,因此尽可能可读 - 我是怎么失败的?真正失败的代码要复杂得多。
-
这是一个很有帮助的评论——它告诉你如果你在这里需要帮助,你需要编写更清晰的代码。我希望您听说过诸如缩进和间距之类的东西?
标签: c++ c++11 templates typetraits