我尝试使用以下命令在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
答案 0 :(得分:3)
“ calloc”声明必须可用
解决方案是在使用calloc
之前声明它。由于它是标准函数,因此必须通过包含指定用于声明它的标准标头来声明它。
calloc
在标头<stdlib.h>
中声明。请注意,不建议使用C标准库中带有后缀的.h
后缀标头,而是使用带有c
前缀的标头<cstdlib>
。但是,c
前缀的标头在std
命名空间中声明了您在这种情况下无法使用的功能。
因此,完整的解决方案是包括<cstdlib>
,并使用std::calloc
。
但是,您根本不需要使用calloc
。更好的解决方案是使用std::make_unique
或std::vector
。
答案 1 :(得分:-1)
如错误消息所示,此处使用的g ++编译器不具有第二个参数为模板类型的实现,即,当第二个参数为int或float类型时,编译器可识别这些参数,因为这些是编译器的类型知道其“ calloc”实现可与这些类型一起使用,但是当第二个参数为模板类型时,它无法识别。 这里使用的Visual Studio可能有一个实现,该实现允许将模板类型传递给“ calloc”。 也许您可以尝试将g ++编译器更新为最新版本,然后它可能支持您在此处尝试执行的操作。
希望这会有所帮助!