Ошибка c2276 недопустимая операция с выражением привязанной функции члена

description title ms.date f1_keywords helpviewer_keywords

Learn more about: Compiler Error C2276

Compiler Error C2276

03/25/2021

C2276

C2276

Compiler Error C2276

operator‘ : illegal operation on bound member function expression

The compiler found a problem with the syntax used to create a pointer-to-member.

Remarks

Error C2276 is often caused when you attempt to create a pointer-to-member by using an instance variable to qualify the member, instead of a class type. You may also see this error if you’re trying to call a member function by using the wrong syntax.

Example

This sample shows several ways C2276 may occur, and how to fix them:

// C2276.cpp
class A {
public:
   int func(){return 0;}
} a;

int (*pf)() = &a.func;   // C2276
// pf isn't qualified by the class type, and it 
// tries to take a member address from an instance of A.
// Try the following line instead:
// int (A::*pf)() = &A::func;

class B : public A {
public:
   void mf() {
      auto x = &this -> func;   // C2276
      // try the following line instead
      // auto x = &B::func;
   }
};

int main() {
   A a3;
   auto pmf1 = &a3.func;   // C2276
   // try the following line instead
   // auto pmf1 = &A::func;
}

есть класс. в public есть double (*dfActivate)(double);

в private определена double dfLineFunc(double)

в конструкторе this->dfActivate = &this->dfLineFunc;
дает ошибку
Ошибка C2276 &: недопустимая операция с выражением привязанной функции-члена support d:newneuralmain.cpp 19

если без &
this->dfActivate = this->dfLineFunc;
ошибка
Ошибка C3867 «neural_network_lib::Neuron::dfLineFunc»: нестандартный синтаксис; используйте «&», чтобы создать указатель на член support d:newneuralmain.cpp 19

и
Ошибка C2440 =: невозможно преобразовать «double (__thiscall neural_network_lib::Neuron::* )(double)» в «neural_network_lib::pfdd» support d:newneuralmain.cpp 19

pfdd* это typedef double(*pfdd)(double);

anton-mix

1 / 1 / 0

Регистрация: 02.11.2011

Сообщений: 68

1

07.10.2012, 19:00. Показов 7927. Ответов 5

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Всем привет, первый раз работаю с потоками
и пока хочу чтобы поток мне вывел значение x*x в окошке

но вот пока не разберусь
поток создаю так

C++
1
2
3
4
5
6
7
8
9
DWORD WINAPI first(PVOID pParam)
{
    
for(int i=0;i<1;i++)
{
    ks=i^2;
}
    return 0;
}

и поток должен начинать работать по кнопке

C++
1
2
3
4
5
6
7
void Cgrafic1Dlg::OnBnClickedButton1()
{
    AfxBeginThread(
        first,
        this);
 
}

но проявляется ошибка что в вызове функции отсутствует список аргументов
а что мне туда собственно передавать?

Добавлено через 45 минут
немного переделал функцию но выкидывает следующее

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DWORD WINAPI sinus(void *pDlg)
{
//ofstream fout("2.txt",ios::out);
    for(int i=0;i<11;i++)
    {
        return i*i;
 
        //fout<<"i^2:"<<i*i<<endl;
    }
    //UpdateData(TRUE);
    return 0;
}
void Cgrafic1Dlg::OnBnClickedButton1()
{
    DWORD id;
    HANDLE hThread=CreateThread(0,256,(LPTHREAD_START_ROUTINE)&sinus,this,&id);
    ResumeThread(hThread);
    
}

Ошибка:
error C2276:&:недопустимая операция с выражением привязанной функции-члена
как тут исправить?

Добавлено через 1 час 8 минут
помогите пожалуйста оч нужно



0



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32592 / 21061 / 8134

Регистрация: 22.10.2011

Сообщений: 36,332

Записей в блоге: 8

07.10.2012, 19:23

2

Во-первых, у тебя не хватает одного параметра для CreateThread (нужно 6 параметров, у тебя их всего 5). А во-вторых — зачем вот этот значок: (LPTHREAD_START_ROUTINE)&sinus? sinus и так адрес функции.



0



1 / 1 / 0

Регистрация: 02.11.2011

Сообщений: 68

07.10.2012, 20:09

 [ТС]

3

4 параметр это то что я передаю в PVOID?

Добавлено через 5 минут
Добавил
HANDLE hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE )sinus,this,0,&id);
но теперь выскакивает ошибка в этой же строчкой с приведением типов..
как исправить?



1



Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32592 / 21061 / 8134

Регистрация: 22.10.2011

Сообщений: 36,332

Записей в блоге: 8

07.10.2012, 21:37

4

Без понятия, что не нравится твоему компилятору. GCC ошибок не видит:

Миниатюры

Error C2276: недопустимая операция с выражением привязанной функции-члена
 



0



1 / 1 / 0

Регистрация: 02.11.2011

Сообщений: 68

07.10.2012, 21:40

 [ТС]

5

Цитата
Сообщение от UI
Посмотреть сообщение

Без понятия, что не нравится твоему компилятору. GCC ошибок не видит:

спасибо сейчас разберусь что к чему…



0



-=ЮрА=-

Заблокирован

Автор FAQ

09.10.2012, 00:23

6

anton-mix, основная твоя ошибка в построении thread-нити (PVOID pParam не просто ненужный прибабах — им передают параметры внутрь функции), которые как я вижу у тебя глобальные. Нет синхронизации в результате потоки живут вразнобой(это черевато потерями данных либо зацикливанием). Чтобы с моей стороны было меньше слов а больше дела ниже даю простой пример пары производитель-потребитель с синхронизацией через критическую секцию

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <windows.h>
#include <process.h>//также помним что нужно поставить MultyThread(DLL)
#include <stdio.h>
#include <time.h>
 
CRITICAL_SECTION cs;
BOOL ParseVKey(int vKey);
void ProducerThread(PVOID pParam);//Будет выводить текущее время в строку
void ConsumerThread(PVOID pParam);//Будет ставить строку от ProducerThread в тайтл консоли
 
typedef struct
{
    HWND hWnd;
    char sMSG[64];
    BOOL bSTOP;
}THREAD_PARAM;
 
int main()
{
    THREAD_PARAM  pParam = {0};
    pParam.hWnd   = GetForegroundWindow();
    pParam.bSTOP  = FALSE;
    COORD BEGIN   = {0};
    HANDLE hOUT   = GetStdHandle(STD_OUTPUT_HANDLE);
 
    InitializeCriticalSection(&cs);//в cs нити и наш основной поток будут хранить данные
    //конкретно в cs будут содержаться поля pParam доступные всем трем потокам 
    //(главному и 2- нитей)
    //Запуск нитей
    _beginthread(ProducerThread,0,&pParam);
    _beginthread(ConsumerThread,0,&pParam);
    
    while(!pParam.bSTOP)
    {
        SetConsoleCursorPosition(hOUT,BEGIN);
        printf("PRESS SPACE FOR STOP ALGORITHMn");
 
        EnterCriticalSection(&cs);//Вход в секцию
        pParam.bSTOP = ParseVKey(VK_SPACE);
        LeaveCriticalSection(&cs);//Выход
 
        //Вход с выходом позволяют осуществлять синхронных доступ к данным
        Sleep(100);
    }
    DeleteCriticalSection(&cs);
    system("pause");
    return 0;
}
 
 
BOOL ParseVKey(int vKey)
{
    BOOL bPressed = false;
    if(GetAsyncKeyState(vKey))//DOWN
    if(GetAsyncKeyState(vKey))//UP
        bPressed = true;
    return bPressed;
}
 
void ProducerThread(PVOID pParam)
{
    THREAD_PARAM *lpParam = (THREAD_PARAM *)pParam;
    time_t t =  0;
    while(!lpParam->bSTOP)
    {
        time(&t);
        EnterCriticalSection(&cs);
        sprintf(lpParam->sMSG, "%s", asctime(localtime(&t)));
        LeaveCriticalSection(&cs);
 
        Sleep(100);
    }
    _endthread();
}
 
void ConsumerThread(PVOID pParam)
{
    THREAD_PARAM *lpParam = (THREAD_PARAM *)pParam;
    while(!lpParam->bSTOP)
    {
        EnterCriticalSection(&cs);
        SetWindowText(lpParam->hWnd, lpParam->sMSG);
        LeaveCriticalSection(&cs);
 
        Sleep(100);
    }
    _endthread();
}

Миниатюры

Error C2276: недопустимая операция с выражением привязанной функции-члена
 

Вложения

Тип файла: rar antonMix.exe.rar (18.7 Кб, 4 просмотров)
Тип файла: rar antonMix_proj.rar (6.5 Кб, 5 просмотров)



0




Форум программистов Vingrad

Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> error C2276: &: недопустимая операция с выражением 

V

   

Опции темы

Mormishka
Дата 23.4.2011, 16:14 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 236
Регистрация: 25.8.2010

Репутация: нет
Всего: нет

Почему нельзя передать указатель на функцию член?

Код

//Sample.h

#pragma once
class Sample
{
public:
    Sample(void);
    int fun1(int(*fun_x)(int),int x0);
    int fun2(int x);
    int fun3(int x);
    ~Sample(void);
};

Код

//Sample.cpp

#include "Sample.h"

Sample::Sample(void)
{
}

int Sample::fun1(int(*fun_x)(int),int x0)
{
    return fun_x(x0);
}

int Sample::fun2(int x)
{
    return x;
}

int Sample::fun3(int x)
{
    return fun1(&fun2,x);
}

Sample::~Sample(void)
{
}

Код

Ошибка    1    error C2276: &: недопустимая операция с выражением привязанной функции-члена
        2    IntelliSense: аргумент типа "int (Sample::*)(int x)" несовместим с параметром типа "int (*)(int)"

Это сообщение отредактировал(а) Mormishka — 23.4.2011, 17:52

PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 16:17 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

pattern`щик
****

Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110

Код

struct Sample {
    int fun1(int(Sample::*fun_x)(int),int x0) {
       (this->*fun_x)(x0);
    }
    int fun2(int x) {}
};

int main() {
   Sample s;
   s.fun1(&Sample::fun2, 33);
}

Это сообщение отредактировал(а) boostcoder — 23.4.2011, 16:18

———————

компилятор онлайн с поддержкой C++11
сборки компиляторов MinGW

PM WWW   Вверх
alexvs11
Дата 23.4.2011, 16:17 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

hell is here
**

Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10

http://forum.vingrad.ru/topic-325577.html
указатель на функцию член не есть указатель на функцию

PM MAIL   Вверх
boostcoder
Дата 23.4.2011, 16:19 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

pattern`щик
****

Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110

Цитата(alexvs11 @  23.4.2011,  16:17 Найти цитируемый пост)
http://forum.vingrad.ru/topic-325577.html
указатель на функцию член не есть указатель на функцию 

Mormishka, так ты уже поднимал этот вопрос…

———————

компилятор онлайн с поддержкой C++11
сборки компиляторов MinGW

PM WWW   Вверх
alexvs11
Дата 23.4.2011, 16:28 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

hell is here
**

Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10

boostcoder, и правда smile 

Это сообщение отредактировал(а) alexvs11 — 23.4.2011, 16:28

PM MAIL   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «C/C++: Для новичков»
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь

  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »

Я пытаюсь установить указатель функции на конструктор класса.

Я получаю следующую ошибку:

Ошибка 1 ошибка C2276: ‘&’: недопустимая операция с выражением связанной функции-члена

Кто-нибудь может посоветовать, пожалуйста, почему это происходит (код ниже)?

Редактировать:

Этот пример проблемы лучше показывает мою ситуацию. Я ТОЛЬКО могу изменить MyClass. Я не могу коснуться MyBase или его содержимого.

class MyBase
{
public:

void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

MyClass()
{
MyFunctionPointer = &MyFunction;
}
};

int _tmain(int argc, _TCHAR* argv[])
{
MyClass temp;

return 0;
}

[/ NOEDIT]

1

Решение

Указатели на функции методов различаются по типу: от указателей на глобальные функции и статические методы.

class MyClass;

class MyBase
{
public:

void (MyClass::* MyFunctionPointer)(int);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

MyClass()
{
MyFunctionPointer = &MyClass::MyFunction;
}
};

int main(int argc, char* argv[])
{
MyClass temp;

return 0;
}

Если вы не можете изменить MyBase, то вы не можете использовать член MyFunctionPointer потому что это указатель типа на глобальную функцию или статический метод. Если вы сообщите нам, чего именно вы пытаетесь достичь, возможно, мы сможем вам помочь.

Редактировать 2 (op ed):

То, что я пытаюсь сделать, это написать код, который дал бы мне эту функциональность. Т.е. базовый класс с указателем на функцию, который может быть установлен как функция, не являющаяся членом (temp1) … или унаследован от класса, который содержит нестатический член, который может быть вызван (temp2).

class MyBase
{
public:

void (*MyFunctionPointer)(int args);

};

class MyClass : public MyBase
{
public:

void MyFunction(int args)
{
}

void Bind(void (*myFunctionPointer)(int args))
{
MyFunctionPointer = myFunctionPointer;
}
};

void MyFunction2(int args)
{
}

int _tmain(int argc, _TCHAR* argv[])
{
MyBase temp1;
temp1.MyFunctionPointer = &MyFunction2;        // <<-- ok
temp1.MyFunctionPointer(0);

MyClass temp2;
temp2.Bind(&temp2.MyFunction);  // <<-- compile error
temp2.MyFunctionPointer(0);

return 0;
}

[/ NOEDIT]

Редактировать:

Как сказано выше, указатель на функции и указатель на методы — это разные типы. То есть указателю на функцию нельзя назначить адрес метода, а указателю на метод нельзя назначить адрес функции. Вы можете иметь 2 указателя, один указатель типа на функцию и другой указатель на метод и логическое значение, которое говорит вам, какой из двух вы используете. Или вы можете использовать шаблоны.

1

Другие решения

MyFunction это член функция, но MyFunctionPointer является указателем базовой функции.

Вы должны изучить синтаксис для производства указатель на член-функцию.

1

Понравилась статья? Поделить с друзьями:
  • Ошибка c2220 следующее предупреждение рассматривается как ошибка
  • Ошибка c1206 kia ceed jd
  • Ошибка c1205 nissan x trail t31
  • Ошибка c1203 nissan x trail t31
  • Ошибка c1203 nissan qashqai j10