Как устранить ошибку calloc () в файлах .cpp и .hpp? - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь запустить .cpp с файлом .hpp в Linux с помощью этой команды: 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 ]

3 голосов
/ 18 июня 2019

должна быть доступна декларация "calloc"

Решение - объявить calloc перед его использованием. Поскольку это стандартная функция, она должна быть объявлена ​​путем включения стандартного заголовка, который указан для ее объявления.

calloc объявлено в заголовке <stdlib.h>. Обратите внимание, что заголовки с суффиксом .h из стандартной библиотеки C не рекомендуется использовать вместо заголовков с префиксом c, таких как <cstdlib>. Однако заголовки с префиксом c объявляют функции в пространстве имен std, которые вы не смогли использовать в этом случае.

Таким образом, полное решение состоит в том, чтобы включить <cstdlib> и использовать std::calloc.


Однако вам вообще не нужно использовать calloc. Лучшее решение - использовать std::make_unique или std::vector.

0 голосов
/ 18 июня 2019

Как следует из сообщения об ошибке, используемый здесь компилятор g ++ не имеет реализации, в которой второй параметр является типом шаблона, т.е. компилятор распознает аргументы, когда второй аргумент имеет тип int или float, потому что это типы, которые компиляторзнает, что его реализация 'calloc' работает с этими типами, НО она не распознает, когда второй аргумент имеет шаблонный тип.Используемая здесь Visual Studio, вероятно, имеет реализацию, позволяющую передавать типы шаблонов в calloc.Возможно, вы можете попробовать обновить компилятор g ++ до последней версии, и тогда он сможет поддерживать то, что вы пытаетесь сделать здесь.

надеюсь, это поможет!

...