首页 > 解决方案 > C++14:在`std::enable_if中调用模板类的静态constexpr模板方法

问题描述

我有以下最小示例:

template <class TLeafType, std::size_t TN>
class cls {
    using LeafType = TLeafType;

    template<typename T>
    static constexpr bool HasNumLeaf() {return std::is_same<typename std::decay<T>::type, double>::value;}

    public:
    template<typename Q = TLeafType>
    typename std::enable_if<HasNumLeaf<Q>(), std::size_t>::type my_impl();

    template<typename Q = TLeafType>
    typename std::enable_if<!HasNumLeaf<Q>(), std::size_t>::type my_impl();
};

template <class TLeafType, std::size_t TN>
template<typename Q>
typename std::enable_if<cls<TLeafType, TN>::template HasNumLeaf<Q>(), std::size_t>::type cls<TLeafType, TN>::my_impl()
{
    std::cout << "Is numeric!!!!" << std::endl;
    return 1;
}

template <class TLeafType, std::size_t TN>
template<typename Q>
typename std::enable_if<!cls<TLeafType, TN>::template HasNumLeaf<Q>(), std::size_t>::type cls<TLeafType, TN>::my_impl()
{
    std::cout << "Is not numeric!!!!" << std::endl;
    return 1;
}

int main() {
    cls<std::string, 10> a;
    cls<double, 12> b;

    std::cout << std::endl<< std::endl << "a: " << std::endl;
    a.my_impl();

    std::cout << std::endl<< std::endl << "b: " << std::endl;
    b.my_impl();
}

在此示例中,我想HasNumLeaf()在第一个模板的上下文中调用静态 constexpr 模板方法,std::enable_if<>以启用或禁用相应的类方法my_impl()

即问题是以下部分:std::enable_if<cls<TLeafType, TN>::template HasNumLeaf<Q>(), std::size_t>

当我使用 g++ 编译时,出现以下错误:

error: no declaration matches ‘typename std::enable_if<HasNumLeaf<Q>(), long unsigned int>::type cls<TLeafType, TN>::my_impl()’
 typename std::enable_if<cls<TLeafType, TN>::template HasNumLeaf<Q>(), std::size_t>::type cls<TLeafType, TN>::my_impl()
note: candidates are: ‘template<class TLeafType, long unsigned int TN> template<class Q> typename std::enable_if<(! HasNumLeaf<Q>()), long unsigned int>::type cls<TLeafType, TN>::my_impl()’
 if<!HasNumLeaf<Q>(), std::size_t>::type my_impl();
note:                 ‘template<class TLeafType, long unsigned int TN> template<class Q> typename std::enable_if<HasNumLeaf<Q>(), long unsigned int>::type cls<TLeafType, TN>::my_impl()’
 _if<HasNumLeaf<Q>(), std::size_t>::type my_impl();
...

使用 clang++,我收到以下错误:

error: out-of-line definition of 'my_impl' does not match any declaration in 'cls<TLeafType, TN>'
typename std::enable_if<cls<TLeafType, TN>::template HasNumLeaf<Q>(), std::size_t>::type cls<TLeafType, TN>::my_impl()

但是如果我内联声明方法,一切都会编译:

template <class TLeafType, std::size_t TN>
class cls {
    using LeafType = TLeafType;

    template<typename T>
    static constexpr bool HasNumLeaf() {return std::is_same<typename std::decay<T>::type, double>::value;}

    public:
    template<typename Q = TLeafType>
    typename std::enable_if<HasNumLeaf<Q>(), std::size_t>::type my_impl()
    {
        std::cout << "Is numeric!!!!" << std::endl;
        return 1;
    }

    template<typename Q = TLeafType>
    typename std::enable_if<!HasNumLeaf<Q>(), std::size_t>::type my_impl()
    {
        std::cout << "Is not numeric!!!!" << std::endl;
        return 1;
    }
};

在外部定义方法的情况下我做错了什么?

标签: c++c++14

解决方案


推荐阅读