模板化类中的is_foo结构

时间:2015-07-07 18:08:28

标签: c++ templates

我在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按照我想要的方式行事?

1 个答案:

答案 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