如何解决.cpp和.hpp文件中的calloc()错误?

时间:2019-06-18 13:50:58

标签: c++ templates unix g++ calloc

我尝试使用以下命令在Linux中使用.cpp文件运行.hpp文件:g++ -c main.cpp,但是遇到关于calloc()的错误:

error: there are no arguments to ‘calloc’ that depend on a template parameter, so a declaration of ‘calloc’ must be available [-fpermissive]
   Tr=(T *)calloc(Rows*Colomns, sizeof(T));

In member function ‘T* MyMatrix::Adjoint()’:
MyMatrix.hpp:276:35: error: there are no arguments to ‘calloc’ that depend on a template parameter, so a declaration of ‘calloc’ must be available [-fpermissive]
   Temp = (T*)calloc(N*N, sizeof(T));

我注意到该代码可在Microsoft Visual Studio中使用:

#pragma once
#include <iostream>
#include <fstream>

template <typename T>
class MyMatrix {
private:
    int Rows;
    int Colomns;
    T* A; //Matricea
    T* Tr; //Transpusa acesteia
    float* Inv; //Inversa
public:
    MyMatrix(int L, int C)
    {

        Rows = L;
        Colomns = C;

        A = (T*)calloc(Rows * Colomns, sizeof(T));
        if (A == NULL)
            throw("Eroare la alocarea matricii! :(");
    }

    MyMatrix(T* S, int L, int C)
        : MyMatrix(L, C)
    {
        for (int i = 0; i < Rows * Colomns; ++i)
            A[i] = S[i];
    }

    ~MyMatrix() { free(A); }

    void Transposed()
    {
        Tr = (T*)calloc(Rows * Colomns, sizeof(T));
        for (int i = 0; i < Colomns; ++i)
            for (int j = 0; j < Rows; ++j)
                Tr[j * Colomns + i] = A[i * Rows + j];
    }

    void Inverse()
    { //some code
        T* Adj = Adjoint();
        Inv = (float*)calloc(Rows * Rows, sizeof(float));
        for (int i = 0; i < this->Rows * this->Rows; ++i)
            Inv[i] = Adj[i] / (float)Det;
    }
};

#endif // MYMATRIX_HPP_INCLUDED

2 个答案:

答案 0 :(得分:3)

  

“ calloc”声明必须可用

解决方案是在使用calloc之前声明它。由于它是标准函数,因此必须通过包含指定用于声明它的标准标头来声明它。

calloc在标头<stdlib.h>中声明。请注意,不建议使用C标准库中带有后缀的.h后缀标头,而是使用带有c前缀的标头<cstdlib>。但是,c前缀的标头在std命名空间中声明了您在这种情况下无法使用的功能。

因此,完整的解决方案是包括<cstdlib>,并使用std::calloc


但是,您根本不需要使用calloc。更好的解决方案是使用std::make_uniquestd::vector

答案 1 :(得分:-1)

如错误消息所示,此处使用的g ++编译器不具有第二个参数为模板类型的实现,即,当第二个参数为int或float类型时,编译器可识别这些参数,因为这些是编译器的类型知道其“ calloc”实现可与这些类型一起使用,但是当第二个参数为模板类型时,它无法识别。 这里使用的Visual Studio可能有一个实现,该实现允许将模板类型传递给“ calloc”。 也许您可以尝试将g ++编译器更新为最新版本,然后它可能支持您在此处尝试执行的操作。

希望这会有所帮助!