Вызов статической перегруженной (классовой) функции / метода неоднозначен - PullRequest
0 голосов
/ 20 июня 2019

В моем классе C ++ у меня есть два статических метода, называемых getInstance.

Объявления методов следующие:

public: // +++ STATIC +++
    static CanCommunicator* getInstance(shared_ptr<ThreadState> state);
    static CanCommunicator* getInstance();

В глобальной функции (требуется из-за устаревшего кода), Я вызываю геттер от объекта:

auto tState = CanCommunicator::getInstance()->getThreadState();

Компилятор (GCC 4.4.5) выдает мне следующую ошибку:

CanCommunicator::getInstance is ambiguous
Candidates are:
CanCommunicator * getInstance()
CanCommunicator * getInstance(std::shared_ptr<IsoTpThreadState>)

Что вызывает эту ошибкуи как я могу это исправить?Перегруженный метод требуется для создания экземпляра, метод без параметров используется для простого извлечения экземпляра.

РЕДАКТИРОВАТЬ: В соответствии с запросом больше кода для примера.

#include <memory>
#include <stdint.h>
#include <linux/can.h>
#include <linux/can/raw.h>

using std::shared_ptr;

//================
// Class in question
//================

struct ThreadState {
    int32_t socketFd;
    uint32_t sendId;
};

class CanCommunicator {
    #define null NULL

    public: // +++ STATIC +++
        static CanCommunicator* getInstance(shared_ptr<ThreadState> state);
        static CanCommunicator* getInstance();
    public:
        shared_ptr<ThreadState> getThreadState() { return this->threadState; }
    protected:
        CanCommunicator(shared_ptr<ThreadState> state);
    private: // +++ STATIC +++
        static CanCommunicator* instance;
    private:
        shared_ptr<ThreadState> threadState;
};


/*
 +++++++++++++++++++++++++++++++++++++
 +++       STATIC VARIABLES        +++
 +++++++++++++++++++++++++++++++++++++
 */

CanCommunicator* CanCommunicator::instance = null;


/*
 +++++++++++++++++++++++++++++++++++++
 +++        STATIC METHODS         +++
 +++++++++++++++++++++++++++++++++++++
 */

CanCommunicator* CanCommunicator::getInstance(shared_ptr<ThreadState> state) {
    if (state == null && instance == null)
        throw "Cannot instantiate from nullptr!";

    return instance == null ? (instance = new CanCommunicator(state)) : instance;
}

CanCommunicator* CanCommunicator::getInstance() { return instance == null ? throw "No instance found!" : instance; }

CanCommunicator::CanCommunicator(shared_ptr<ThreadState> state) {
    this->threadState = state;        
}

//================
// Calling code
//================

int canSendData(int32_t skt, uint32_t sendCanId, const uint8_t* data, uint8_t dataLength, uint8_t extended) {
    struct can_frame myCanFrame;
    return (int)write(skt, &myCanFrame, sizeof(myCanFrame));
}

int isotp_user_send_can(const uint32_t arbitrationId, const uint8_t* data, const uint8_t size) {
    auto tState = CanCommunicator::getInstance()->getThreadState(); //<-------- Error originates here
    return canSendData(tState->socketFd, (int)tState->sendId, data, size, false) > 0 ? 0 : 1;
}

1 Ответ

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

Благодаря предложению Радослава я просто переименовал функцию-нарушитель в getInstanceByState ().

Похоже, что это ошибка в используемой версии GCC (4.4.5), поэтому нет верного исправления, кроме как ждать, пока я смогу использовать (намного) более новую версию компилятора.

Спасибо всем, кто помогал и давал предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...