template < typename T >
using is_C__ = typename std :: conditional<
is_C_v< T >
, std :: true_type
, std :: false_type
> :: type;
こんなコードで上記エラーが is_C_v< T >
で発生した。
コレ以外に特にエラーを吐いていない。
using
で型のエイリアスを指定していなかったちなみに is_C_v< T >
はエイリアステンプレート。なんじゃろかと思って定義を見に行ったら
template < typename T >
using is_C_v = typename std :: is_same< T, C > :: value ;
ポカミスをしていた。
using
は型のエイリアスなのに最後に勢いで :: value
をつけてしまっているので
is_C_v = true/false;
となり、そもそも定義が間違っていて代入できないはずだが、それでも is_C_v
側にエラーが出ない。
で、 is_C_v
型なので bool
に型変換できないと怒られている、という状態だった。
using
単体の場合はエラーが出る一方、単体で型として利用すると、
typeid( is_C_v< C >);
Typename specifier refers to non-type member 'value' in 'std::__1::is_same<C, C>'
ちゃんと value
は型じゃないと怒られた。
単体テスト大事。
value
を保持したい時はconsexpr bool is_C = typename std :: is_same< T, C > :: value ;
特に難しく考えることもなく、 bool
で拾ってあげればよい。