c++ - 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;
}
};
在外部定义方法的情况下我做错了什么?
解决方案
推荐阅读
- ansible - 如何在ansible playbook中比较来自多个主机的事实
- html - TD 扩展到绝对定位内容的大小
- python-3.x - 将 ThreadPoolExecutor 与一名工作人员一起使用是个好主意吗?
- android-studio - 无法在导入的颤振项目中使用特定图标
- apache-spark - 在 Cassandra 中使用 Spark 插入数据
- c - 没有错误时 Visual Studio 不显示警告 (C++)
- swagger - 将 API Gateway Cloudformation 模板转换为 Swagger 文件
- python - 有没有办法将 main.py 文件放入文件夹中?
- excel - 具有多种复杂性的 IF 函数
- r - 如何在R中按组计算某些变量的比例?