-
Kernel.h
namespace GateServer { class CKernel { using PFMsgHandler = std::function<bool(const char * pMsg, int MsgLen)> public: bool Initialize(); PFMsgHandler m_MsgHandler[100]; bool OnMsgFromCS(const char * pMsg, int MsgLen); } } -
Kernel.cpp
#include "Kernel.h" namespace GateServer { bool CKernel::Initialize() { m_MsgHandler[0] = &CKernel::OnMsgFromCS; //error return true; } }
При попытке скомпилировать программу получаю следующую ошибку:
Error C2679 binary ‘=’: no operator found which takes a right-hand
operand of type ‘bool (__thiscall GateServer::CGSKernel::* )(const
char *,int)’ (or there is no acceptable
conversion) GSKernel c:\projects\с++\sonic\server\gateserver\gskernel\gskernel.cpp 28
Arhadthedev
11.5k8 золотых знаков42 серебряных знака69 бронзовых знаков
задан 3 июн 2017 в 17:50
Вы пытаетесь присвоить std::function указателю на член класса.
Решить проблему можно одним из двух способов:
-
Сделать
PFMsgHandlerуказателем:namespace GateServer { class CKernel { using PFMsgHandler = bool(GateServer::*)(const char * pMsg, int MsgLen); // ... -
Либо заключить указатель внутрь экземпляра
std::function:#include "Kernel.h" namespace GateServer { bool CKernel::Initialize() { m_MsgHandler[0] = std::bind( &CKernel::OnMsgFromCS, this, std::placeholders::_1, std::placeholders::_2 ); return true; } }
ответ дан 3 июн 2017 в 18:01
ArhadthedevArhadthedev
11.5k8 золотых знаков42 серебряных знака69 бронзовых знаков
Нестатические методы класса не являются обычными функциями. В частности, у каждого нестатического метода класса концептуально есть скрытый параметр ClassType *this.
В вашем случае метод CKernel::OnMsgFromCS фактически имеет три параметра: CKernel *this, const char * pMsg и int MsgLen. Вы же пытаетесь засунуть указатель на этот метод в std::function , у которого только два параметра. Поэтому и возникает ошибка.
А уж как эту ошибку исправлять зависит от того, что вы пытаетесь сделать.
ответ дан 3 июн 2017 в 18:05
Есть и 3-й способ решения, для которого нужно немного видоизменить PFMsgHandler:
using PFMsgHandler = std::function<bool(CKernel&, const char * pMsg, int MsgLen)>
И когда будете вызывать экземпляр PFMsgHandler нужно будет передавать объект, для которого функция класса должна быть вызвана, например:
m_MsgHandler[0](*this, "Message", 0);
Конечно, можно в определении PFMsgHandler использовать указатель, а не ссылку, что будет удобнее с this, но будет менее удобно с объектами, которые указателями не являются.
ответ дан 4 июн 2017 в 7:24
ixSciixSci
23.7k3 золотых знака46 серебряных знаков61 бронзовый знак
Search code, repositories, users, issues, pull requests…
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Ошибка C2679 является частой ошибкой, возникающей при использовании шаблонных классов или функций в языке программирования C++. Ошибка происходит, когда компилятор не может найти подходящую функцию или оператор для выполнения операции с использованием шаблонного типа данных.
Возможные причины ошибки C2679
Среди причин возникновения ошибки C2679 могут быть следующие:
- Необходимость явного приведения типов
- Недостаточная специализация шаблонов
- Несовпадение типов данных
Способы устранения ошибки C2679
Для устранения ошибки C2679 можно использовать следующие методы:
Явное приведение типов
Для решения проблемы необходимости явного приведения типов можно использовать приведение типов в коде. Например, если возникает ошибка C2679 при попытке присвоить указатель типа void* переменной типа int*, можно явно привести типы следующим образом:
int* pointer = static_cast<int*>(void_pointer);
Добавление специализации шаблона
Если возникает ошибка C2679 из-за недостаточной специализации шаблонов, можно добавить специализацию шаблона для нужного типа данных. Например:
template<>
class MyTemplateClass<int> {
// Code for handling int type
};
Изменение типов данных
Если возникает ошибка C2679 из-за несовпадения типов данных, можно изменить тип данных на подходящий. Например, если указан неверный тип данных для оператора <<, нужно изменить тип данных на подходящий для вывода.
Заключение
Ошибка C2679 может быть вызвана множеством причин, однако ее устранение не всегда сложно. Используя указанные выше методы, можно быстро и легко исправить ошибку C2679 и продолжить работу с шаблонными классами и функциями в C++.

НЕ давно начал изучать С++. написал программу которая предоставлена в учебники но она у меня что то не компилируется
Вот код:
| C++ | ||
|
Вот ошибки компилятора Microsoft Visual C++ 6.0:
error C2679: binary ‘>>’ : no operator defined which takes a right-hand operand of type ‘class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >’ (or there is no accept
able conversion)
fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.
Помогите их исправить
Hey Spiceworks Users,
I couldn’t find a C/C++ Programming group when choosing a group for this question, so I apologize in advance.
I am having to go through someone’s sloppy code and convert a program that was made in Visual Studio 6 to be useable in Visual Studio 2010, and I’ve hit this wall that I can’t seem to get over.
Here is the error I’m getting…
-
c:\\program files\\microsoft visual studio 10.0\\vc\\include\\utility(217): error C2679: binary ‘=’ : no operator found which takes a right-hand operand of type ‘const CFGArray’ (or there is no acceptable conversion)
1> c:\\work\\pb\\library\\vc++\\config.h(22): could be ‘CFGArray &CFGArray::operator =(CFGArray &)’
1> while trying to match the argument list ‘(CFGArray, const CFGArray)’
1> c:\\program files\\microsoft visual studio 10.0\\vc\\include\\utility(215) : while compiling class template member function ‘std::pair<_Ty1,_Ty2> &std::pair<_Ty1,_Ty2>::operator =(const std::pair<_Ty1,_Ty2> &)’
1> with
1> [
1> _Ty1=CString,
1> _Ty2=CFGArray
1> ]
1> c:\\work\\pb\\library\\vc++\\config.cpp(39) : see reference to class template instantiation ‘std::pair<_Ty1,_Ty2>’ being compiled
1> with
1> [
1> _Ty1=CString,
1> _Ty2=CFGArray
1> ]
Here is, what I think, is the relevant code…
Config.h
-
class CFGArray : public CArray<cfgValue, cfgValue>{
public:
CFGArray();
CFGArray(const CFGArray ©);
CFGArray& operator= (CFGArray&); // This is line Line 22
};
Config.cpp
-
CFGArray::CFGArray(){this->RemoveAll();}
CFGArray::CFGArray(const CFGArray ©){
this->RemoveAll();
int i;
for(i = 0; i < copy.GetSize(); ++i)
this->Add(copy[i]);
}
CFGArray& CFGArray::operator= (CFGArray& rhs){
if (this != &rhs) {
int i;
this->RemoveAll();
for(i = 0; i < rhs.GetSize(); ++i)
this->Add(rhs[i]);
}
return *this;
}
Any idea how I can fix this?
