Ошибка компилятора c2679

  • 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's user avatar

Arhadthedev

11.5k8 золотых знаков42 серебряных знака69 бронзовых знаков

задан 3 июн 2017 в 17:50

Tarakan's user avatar

Вы пытаетесь присвоить std::function указателю на член класса.

Решить проблему можно одним из двух способов:

  1. Сделать PFMsgHandler указателем:

    namespace GateServer
    {
        class CKernel
        {
            using PFMsgHandler = bool(GateServer::*)(const char * pMsg, int MsgLen);
    
            // ...
    
  2. Либо заключить указатель внутрь экземпляра 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

Arhadthedev's user avatar

ArhadthedevArhadthedev

11.5k8 золотых знаков42 серебряных знака69 бронзовых знаков

Нестатические методы класса не являются обычными функциями. В частности, у каждого нестатического метода класса концептуально есть скрытый параметр ClassType *this.

В вашем случае метод CKernel::OnMsgFromCS фактически имеет три параметра: CKernel *this, const char * pMsg и int MsgLen. Вы же пытаетесь засунуть указатель на этот метод в std::function , у которого только два параметра. Поэтому и возникает ошибка.

А уж как эту ошибку исправлять зависит от того, что вы пытаетесь сделать.

ответ дан 3 июн 2017 в 18:05

AnT stands with Russia's user avatar

Есть и 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

ixSci's user avatar

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++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <conio.h>
#include <locale.h>
using namespace std;
int main()
{
    setlocale(LC_ALL,"Rus");
    int i;
    string pr=" ";
    string cur;
    while(cin>>cur)
    {
        ++i;
         if(pr==cur)
             cout<<"Количество слов"<<i<<"pr"<<cur<<endl;
         pr=cur;
    }
 
                                                                    
return 0;
}

Вот ошибки компилятора 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 &copy);
    CFGArray& operator= (CFGArray&); // This is line Line 22
    };

Config.cpp

  • CFGArray::CFGArray(){this->RemoveAll();}
    CFGArray::CFGArray(const CFGArray &copy){
    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?

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Ошибка коммутации внутреннего и внешнего блоков причины
  • Ошибка ккт 7008
  • Ошибка компилятора c2678
  • Ошибка кода 1 ошибка системы tp link
  • Ошибка компилятора c2371

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: