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 Метки нет (Все метки)
Всем привет, первый раз работаю с потоками но вот пока не разберусь
и поток должен начинать работать по кнопке
но проявляется ошибка что в вызове функции отсутствует список аргументов Добавлено через 45 минут
Ошибка: Добавлено через 1 час 8 минут
0 |
Супер-модератор 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 минут
1 |
Супер-модератор 32592 / 21061 / 8134 Регистрация: 22.10.2011 Сообщений: 36,332 Записей в блоге: 8 |
|
07.10.2012, 21:37 |
4 |
Без понятия, что не нравится твоему компилятору. GCC ошибок не видит: Миниатюры
0 |
1 / 1 / 0 Регистрация: 02.11.2011 Сообщений: 68 |
|
07.10.2012, 21:40 [ТС] |
5 |
Без понятия, что не нравится твоему компилятору. GCC ошибок не видит: спасибо сейчас разберусь что к чему…
0 |
Заблокирован |
||||||||
09.10.2012, 00:23 |
6 |
|||||||
anton-mix, основная твоя ошибка в построении thread-нити (PVOID pParam не просто ненужный прибабах — им передают параметры внутрь функции), которые как я вижу у тебя глобальные. Нет синхронизации в результате потоки живут вразнобой(это черевато потерями данных либо зацикливанием). Чтобы с моей стороны было меньше слов а больше дела ниже даю простой пример пары производитель-потребитель с синхронизацией через критическую секцию
Миниатюры
Вложения
0 |
Форум программистов Vingrad
Модераторы: bsa |
Поиск: |
|
Опции темы |
Mormishka |
|
||||||
Бывалый Профиль Репутация: нет
|
Почему нельзя передать указатель на функцию член?
Это сообщение отредактировал(а) Mormishka — 23.4.2011, 17:52 |
||||||
|
|||||||
boostcoder |
|
||
pattern`щик Профиль Репутация: 20
|
Это сообщение отредактировал(а) boostcoder — 23.4.2011, 16:18 ——————— компилятор онлайн с поддержкой C++11 |
||
|
|||
alexvs11 |
|
||
hell is here Профиль Репутация: 2
|
http://forum.vingrad.ru/topic-325577.html |
||
|
|||
boostcoder |
|
||
pattern`щик Профиль Репутация: 20
|
Mormishka, так ты уже поднимал этот вопрос… ——————— компилятор онлайн с поддержкой C++11 |
||
|
|||
alexvs11 |
|
||
hell is here Профиль Репутация: 2
|
boostcoder, и правда Это сообщение отредактировал(а) alexvs11 — 23.4.2011, 16:28 |
||
|
|||
|
Правила форума «C/C++: Для новичков» | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, 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