1

我有一个错误

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:
<...>

有什么问题?

4

3 回答 3

3

您正在尝试创建一个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——在用户定义的类型上添加现有模板的新特化。

于 2013-08-15T18:39:24.377 回答
2

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

就个人而言,我会将这个定义放在与XX::YY

于 2013-08-15T18:27:23.363 回答
0
  1. numeric_limits 不会尝试继承自身。

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

问题是“限制”在包含路径中。所以它试图包含自己,而不是标准限制。结果根本没有在文件开头声明 numeric_limits 。

我从包含路径中排除了目录,一切正常。

于 2013-08-16T16:49:10.463 回答