Как устранить ошибку calloc() в файлах .cpp и .hpp?

Я пытаюсь запустить .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

person Mike Bee    schedule 18.06.2019    source источник
comment
Лучшим решением было бы вообще не использовать calloc. Вместо этого используйте std::vector.   -  person Yksisarvinen    schedule 18.06.2019
comment
Возможный дубликат Нет аргументов, зависящих от шаблона параметр   -  person Yastanub    schedule 18.06.2019
comment
Если у вас есть отчаянное желание управлять памятью вручную, вам следует использовать new[] и delete[], а не функции C.   -  person molbdnilo    schedule 18.06.2019
comment
Посмотрите, в каком заголовке объявлен calloc.   -  person molbdnilo    schedule 18.06.2019
comment
Хватит писать C на C++! Просто используйте std::vector и примените правило нуля.   -  person Marek R    schedule 18.06.2019


Ответы (2)


должно быть доступно объявление calloc

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

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

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


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

person eerorika    schedule 18.06.2019

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

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

person dorKKnight    schedule 18.06.2019
comment
Нет, T не является шаблонным типом, и проблема не связана с типами, переданными в calloc. Проблема просто в том, что соответствующий заголовок, объявляющий calloc, не был включен. - person Jonathan Wakely; 20.06.2019