'numeric_limits'不是模板

'numeric_limits' is not a template

本文关键字:numeric limits      更新时间:2023-10-16

我有一个错误

limits:30:29: error: 'numeric_limits' is not a template

在文件中,它重载特定类的std::numeric_limits:

  // file "limits"
#include <limits>
namespace std
{
template<typename T> struct numeric_limits<XX::YY<T> > : public 
                            numeric_limits<typename XX::YY<T>::ZZ>
{
private:
<...>

什么可能是问题?

您正试图创建一个从std::numeric_limits继承的std::numeric_limits,但当您到达public numeric_limits...部分时,您已经声明了自己的模板(仍然不完整),该模板已经命名为numeric_limits,因此它正试图从自身继承,而不是从现有的std::numeric_limits继承。

std::numeric_limits不是一个基类,也不提供任何虚拟函数,所以从它继承无论如何都没有用。为了使numeric_limits正确处理您的特定类,您需要为该类型定义numeric_limits的专门化:

#include <limits> // get base template definition + standard specializations
namespace std { 
template<>        // define your specialization
class numeric_limits<MyType> {
// ...
};
}

请注意,这是唯一允许向std命名空间添加内容的情况之一——在用户定义的类型上添加现有模板的新专门化。

您的文件不应该像那样命名为limits,因为它会阻止包含正常的系统头。我甚至不确定重新定义标题是否合法。

就我个人而言,我会把这个定义放在与XX::YY 相同的头文件中

  1. numeric_limits不尝试继承自身。

  2. 该文件可以命名为"limits",直到它不在包含路径中为止。

问题是"限制"在include路径中。因此,它试图包括自己,而不是std限制。因此,在文件的开头根本没有声明numeric_limits。

我从include路径中排除了目录,一切都很好。