Очередь ожидания - «нет подходящей функции для вызова» - PullRequest
0 голосов
/ 04 января 2019

Я пишу очередь Waitable с использованием Mutex, Semaphore и Exceptions и не могу найти, почему я получаю ошибки некоторых компиляторов, это первая ошибка:

"../ Include / SemaphoreException.h: 17: 90: нет соответствующей функции для вызова в ImpException :: ImpException () ’ SemaphoreException :: SemaphoreException (const char * _file, size_t _line, std :: string & _msg) "

Неужели я плохо использую std :: exception?

SemaphoreException code:

#ifndef __SEMAPHORE_EXCEPTION_H__
#define __SEMAPHORE_EXCEPTION_H__

#include "ImpException.h"

class SemaphoreException : public ImpException
{
public:
    SemaphoreException(const char* _file, size_t _line, std::string& _msg);
    virtual ~SemaphoreException() throw();
};

/************************************ should be implemented in a separated cpp file ************************************/

SemaphoreException::SemaphoreException(const char* _file, size_t _line, std::string& _msg)
{
    ImpException(_file, _line, _msg);
}

SemaphoreException::~SemaphoreException() throw() {}

#endif

и это код ImpException:

#ifndef __IMP_EXCEPTION_H__
#define __IMP_EXCEPTION_H__

#include <exception>
#include <string>
#include <iostream>
#include <sstream>

class ImpException : public std::exception
{
public:
    ImpException(const char* _file, size_t _line, std::string& _msg);
    virtual ~ImpException() throw();

private:
    std::string m_msg;

    void Notify(const char* _file, size_t _line, std::string& _msg);
};


/************************************ should be implemented in a separated cpp file ************************************/

ImpException::ImpException(const char* _file, size_t _line, std::string& _msg) 
{
    Notify(_file, _line, _msg);
}

ImpException::~ImpException() throw() {}

void ImpException::Notify(const char* _file, size_t _line, std::string& _msg)
{
    std::stringstream ss;

    ss << _line;

    m_msg = std::string(_file) + std::string(": ") + ss.str() + std::string(": ") + _msg;

    ss << m_msg;
}

#endif

1 Ответ

0 голосов
/ 05 января 2019

Ваша проблема здесь:

SemaphoreException::SemaphoreException(const char* _file, size_t _line, std::string& _msg)
// You are missing the call to the base class constructor here
{
    ImpException(_file, _line, _msg); // this does not do what you think it does.
}

Это должно выглядеть так, потому что конструктор базового класса должен быть вызван первым:

SemaphoreException::SemaphoreException(const char* _file, size_t _line, std::string& _msg)
: ImpException(_file, _line, _msg)
{}

Ваш код на самом деле эквивалентен этому:

SemaphoreException::SemaphoreException(const char* _file, size_t _line, std::string& _msg)
: ImpException()  // compiler can't find this and complains!
{
    ImpException(_file, _line, _msg); // a momentary separate instance only.
}
...