使用Linux编译器获取错误但却失去了意义

时间:2013-02-13 22:24:40

标签: c++ compiler-errors compiler-warnings

我使用codeblocks构建我的程序,但是对于学校我们应该通过linux系统编译。我在这里得到了一些错误,但我在149.遇到了麻烦。我不知道它在抱怨什么。也许有人可以帮助我?

In file included from matrix.cpp:9:0:
matrixClass.h: In member function âT Matrix<T>::GetData(int, int) const [with T = int]â:
matrixClass.h:149:17:   instantiated from âstd::ostream& operator<<(std::ostream&, const Matrix<int>&)â
matrix.cpp:22:13:   instantiated from here
matrixClass.h:131:16: warning: converting to non-pointer type âintâ from NULL

我的代码如下。

T GetData(int row, int column) const
{
    if (row>=0 && row<numrows() && column>=0 && column<numcols())
    {
        return pData[GetRawIndex(row, column)];
    }
    return NULL;
}

//Output matrix arrays here.
friend ostream& operator<<(ostream& os, const Matrix<T>& matrix)
{
    os << "[";
    for(int i = 0; i<matrix.numrows(); i++)
    {
        for(int j = 0; j < matrix.numcols(); j++)
            os << matrix.GetData(i,j) << " ";

        os << endl;
    }
    os << "]" <<endl;
    return os;
}

2 个答案:

答案 0 :(得分:2)

没有错误。这只是一个警告。这些线告诉你:

  1. 哪个文件包含带警告的文件。
  2. 警告发生的模板功能。
  3. 实例化模板功能的功能。
  4. 实例化发生的行。
  5. 警告本身。
  6. 警告告诉您,当您的函数的返回类型为NULLint)时,您将返回T = int。虽然NULL只给你0,但编译器很清楚NULL只应该与指针一起使用,并给你一个警告,你可能做错了。

答案 1 :(得分:2)

首先,代码是正确的,虽然可能不是你真正想要的,这就是编译器警告你的原因。

在C ++中,NULL被定义为0(整数0),因此在您Matrix<int>的实例化中,如果用户尝试访问超出范围的元素,您将返回0(整数值0)。 NULL用于表示不引用有效内存的指针,编译器看到你在return语句中使用它...所以它想知道你是否真的想要返回一个指针或值0 ...

这引出了一个问题,你为什么要回归NULL?你真的想要返回0吗?因为如果你没有编译器只是帮你找到了一个bug ...