Я использую g ++ 4.4.1 и имею проблему с передачей по ссылке в моем классе в пространстве имен. Я создал тестовую программу ниже, которая может продемонстрировать мою проблему и хотел бы, если кто-нибудь знает, почему она не скомпилируется
#include <stdio.h>
namespace clshw
{
class hwmgr
{
private:
hwmgr() {};
public:
~hwmgr() {};
static hwmgr* Instance();
int Read(int crumb, int& state);
private:
static hwmgr* instance;
};
}
namespace clshw
{
hwmgr* hwmgr::instance = NULL;
hwmgr* hwmgr::Instance()
{
instance = new hwmgr;
return instance;
}
int hwmgr::Read(int crumb, int state)
{
state = true;
return 1;
}
}
using namespace clshw;
hwmgr *hw = hwmgr::Instance();
int main()
{
int state;
int crumb;
int ret = hw->Read(crumb, state);
}
Ошибка компиляции:
test7.cpp: 30: ошибка: прототип для int clshw :: hwmgr :: Read (int, int) не соответствует ни одному в классе clshw :: hwmgr
test7.cpp: 13: ошибка: кандидат: int clshw :: hwmgr :: Read (int, int&)
ТИА,
Кит
Проблема заключается в строке № 13.
int Read(int crumb, int& state);
Вы предоставили функцию Read, которая принимает один int и один адрес int.
и на линии № 30, int hwmgr::Read(int crumb, int state)
вы определяете функцию Read, которая принимает два типа int.
Поскольку вы предоставляете разные типы аргументов, оба метода различны. Поэтому компилятор выдаст вам ошибку: прототип для int clshw :: hwmgr :: Read (int, int) не соответствует ни одному в классе clshw :: hwmgr
Пожалуйста, исправьте определения следующим образом:
в строке № 30 напишите это:
int hwmgr::Read(int crumb, int &state)
и тадааааа! Мы заставили это работать.
Ваш декларация функции Read
отличается от определение из Read
Вы предоставили.
Декларация:
int Read(int crumb, int& state);
И определение:
int hwmgr::Read(int crumb, int state)
Вы должны решить, какой из них вы хотите использовать ссылка или значение), и измените другой соответственно. Кажется, что ссылка решение является единственным правильным выбором в этой ситуации, так как ваша функция меняет значение state
аргумент.