我在foo
上模仿size_t
结构。我想写一个is_foo
结构,这样is_foo<T>::value
当{且仅当T
foo<N>
看起来像某些N
时才为真。以下是我的问题的最小示例:
template<typename T>
class Bar {
public:
template<size_t N> struct foo{};
template<typename> struct is_foo : std::false_type{};
template<size_t N> struct is_foo<foo<N>> : std::true_type{};
template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
Bar(int x) {}
};
我的问题是Bar<double> b(5);
中的main
无法编译,这意味着is_foo<foo<0>>::value
原来是false
。但是,如果我从template<typename T>
的声明中删除class Bar
,则Bar b(5)
将正常编译。如何让is_foo
按照我想要的方式行事?
答案 0 :(得分:2)
我的问题是main中的
Bar<double> b(5);
无法编译, 意思是is_foo<foo<0>>::value
原来是false
不是。
+ g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp
main.cpp:10:25: error: need 'typename' before 'std::enable_if<Bar<T>::is_foo<Bar<T>::foo<0ul> >::value>::type' because 'std::enable_if<Bar<T>::is_foo<Bar<T>::foo<0ul> >::value>' is a dependent scope
template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
^
[snip]
+ clang++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp
main.cpp:10:25: error: missing 'typename' prior to dependent type name 'std::enable_if<is_foo<foo<0> >::value>::type'
template<typename = std::enable_if<is_foo<foo<0>>::value>::type>
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
typename