Error cannot declare member function to have static linkage

I'm trying to understand why the following is an error: class Foobar { public: static void do_something(); }; static void Foobar::do_something() {} // Error! int main() { Foobar::do_somethi...

The keyword static has several different meanings in C++, and the code you’ve written above uses them in two different ways.

In the context of member functions, static means «this member function does not have a receiver object. It’s basically a normal function that’s nested inside of the scope of the class.»

In the context of function declarations, static means «this function is scoped only to this file and can’t be called from other places.»

When you implemented the function by writing

static void Foobar::do_something() {} // Error!

the compiler interpreted the static here to mean «I’m implementing this member function, and I want to make that function local just to this file.» That’s not allowed in C++ because it causes some confusion: if multiple different files all defined their own implementation of a member function and then declared them static to avoid collisions at linking, calling the same member function from different places would result in different behavior!

Fortunately, as you noted, there’s an easy fix: just delete the static keyword from the definition:

void Foobar::do_something() {} // Should be good to go!

This is perfectly fine because the compiler already knows that do_something is a static member function, since you told it about that earlier on.

In C++, we don’t need to specify the static keyword in the declaration of the header and in the definition in the class.

It means that this keyword has to be added only in the header.

You probably know that using the static keyword means that the function is unique in program.
So if you add static in the .h and in the .cpp, you will have like two methods with the same name.
And the compiler won’t appreciate it.

Let’s take two examples, one not working and another yes.

We are going to implement 2 files:

  • MyClass.h
  • MyClass.cpp

The bad

MyClass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_

class MyClass {
public:
    MyClass();
    virtual ~MyClass();

    static void myMethod();
};

#endif /* MYCLASS_H_ */

MyClass.cpp

#include "MyClass.h"

MyClass::MyClass() {
}

MyClass::~MyClass() {
}

static void MyClass::myMethod() {
}

The good

MyClass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_

class MyClass {
public:
    MyClass();
    virtual ~MyClass();

    static void myMethod();
};

#endif /* MYCLASS_H_ */

MyClass.cpp

#include "MyClass.h"

MyClass::MyClass() {
}

MyClass::~MyClass() {
}

void MyClass::myMethod() {
}

Conclusion

A really annoying problem that you’ve just solved.
Great job. cool

Содержание

  1. ошибка функции потока в sdl
  2. ошибка при компиляции статическим методом
  3. 2 ответы
  4. ошибка при компиляции статическим методом
  5. Решение
  6. Другие решения

ошибка функции потока в sdl

В прошлый раз была тоже проблема с этой функцией в с++. В си нормально. В общем есть класс. чтобы использовать поток нужно создать

чтобы использовать не статичные методы в потоках используют bind или lambda function

Давно тебя хотел спросить: за що? За что столько пробелов?

Мне так нравиться. Смотришь на код и видишь отдельные слова, отдельные скобки, арифметические знаки, классно выглядет так. Я кстати в начале книге по с++ видел что автор так тоже писал, но потом другие примеры были уже без пробелов.

Скажи честно, ты наркоман? Раз пишешь на плюсах, так используй std::thread. А то и вовсе SFML вместо SDL2.

Передавай this третьим аргументом в SDL_CreateThread, в статичной функции кастуй переданный указатель к объекту и вызывай какие хочешь методы этого объекта.

Можно пример в коде, а то я не совсем понимаю?

error: cannot declare member function

Ну так у тебя ошибка вообще с SDL не связана. Просто код неправильный.

Покажи как обьявлен класс Game (особенно его метод pollevent) и потом как данный метод определен.

Передайте ему, а то он анонимов побанил.

Ключевое слово static не пишется, если реализация метода вынесена за предела объявления класса. Короче, в файлах .cpp перед методом не пиши static .

Можно пример в коде, а то я не совсем понимаю?

Либо вернись обратно на C, либо возьми SFML.

Хотя лучше на js, там есть canvas/webgl если хочешь сам, и много движков если хочешь готовое, запутстится даже в браузере! static в примере SDL_Thread добавленна просто так, это типа private метод в С.

если хочешь сам, и много движков если хочешь готовое,

Да я так, для мышления, пишу чтобы думать как такое можно написать.

Напиши лучше движок для начала.

Я незнаю за что взяться, я даже банально не могу получить нужную позицию. Вот смотри, если в opengl сделать glOrtho, а может и без glortho, то начала координат начинается посередине. Если сделать glortho, то пиксели могут быть увеличенными, они могут различаться с настоящей системой координат, по размеру пикселя. Тогда как можно узнать, есть ли указатель мыши над кнопкой например? Мне советовали делать пропорции экрана и высчитывать, но как это сделать я незнаю, может поможешь?

Если ты кнопку хочешь сделать то возьми Nuklear. Если все сам хочешь, то ставь gluOrtho2d, и далее потом переводи координаты OpenGL в пиксельные. Или что?

далее потом переводи координаты OpenGL в пиксельные.

Не вижу проблем в обьявлении: должно работать. Проблема где-то еще. Читай внимательно *все* диагностики компилятора.

Ну там какие? [ -1; +1]. Вот, а экранные [ 0; 640] к примеру.

Ну спасибо, потом проверю. Там вроде в int величины экранов, пиксели же. Тогда можно window_width >> 1 ,

Но блин это пустая трата времени, вот в nuklear нарисовать окно с кнпокой проще простого

Там надо все в float/double считать.

Да что то фейлы за фейлом. Fix.

Очень конструктивный ответ.

Ну а что вы ожидали от персонажа, который ни документацию, ни код прочесть не может. Он ждет, когда за него решат его проблему.

С EngineCore где будут функции для строк, вектров, кучи, только не вздумай реализовывать то что уже есть! Потом переходи на EngineGraphics где сделай окно, обработку событий окна. Сделай структуру для текстуры, там длинну ширину, GLuint texture_id конечно же, структура цветов, EngineMath где структуры векторов, операции над ними, матрицы, и все такое, еще нужно создать структуру камеры. Далее создай базовую структуру:

Писать лучше на С89 так как костыльный код на нем становится ужасно некрасивым, и сразу хочеться переделать, еще и скомпилируется везде. Для графики SDL2/OpenGL если GL старый то возьми glu, если новый с шейдерами итд то возьми: https://github.com/arkanis/single-header-file-c-libs/blob/master/math_3d.h . Для загрузки текстур лучше SDL2_image он поддерживает почти все форматы, для звука SDL2_mixer, для сети SDL2_net, и для рисовки текста тоже SDL2_ttf, хотя если тебе не нужен он на текстурах или просто в свободном пространстве то текст рисовать лучше с помощью Nuklear, вот его как раз и для GUI взять можно, как физический движок есть ODE, он написан на плюсах вроде, но у него интерфейс на чистом C. Еще неплохо было бы встроить в формат карт скриптование, удобная вещь! Тут советую взять http://duktape.org/
Для анимированных моделей можно взять MD2 для начала.

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

Источник

ошибка при компиляции статическим методом

Заявлено в моем заголовке, пытаясь скомпилировать мой файл со статическим методом внутри моего кода. Мой computeCivIndex() пытается получить 5 входных данных от пользователя, выполнить расчет и вернуть значение с плавающей запятой.

this.sunType для синтаксиса java, но для V++, что я должен использовать, чтобы связать их вместе, если оба имеют одно и то же имя?

В моем коде есть методы получения и установки, а также 2 конструктора, которые слишком длинны для публикации.

2 ответы

static декларация откладывается от static реализация. Статическая реализация означает, что ваш функциональный символ доступен только в файле, в котором он реализован.

Просто удалите статику перед реализацией функции. Кроме того, статическая функция является функцией класса, вы не можете получить доступ к нестатическим членам класса в них. Они предназначены для использования без экземпляра объекта, поэтому нет переменных экземпляра.

ответ дан 16 окт ’12, 13:10

Ошибка компилятора кажется мне достаточно ясной:

ошибка: «это» недоступно для статических функций-членов

В основном, потому что член static , он не выполняется в контексте конкретного экземпляра типа, поэтому использование this внутри метода бессмысленно. Ты do попробуй использовать this , отсюда и ошибка.

Когда вы объявляете функцию-член в объявлении класса, ключевое слово static указывает, что функция используется всеми экземплярами класса. Статическая функция-член не может получить доступ к члену-экземпляру, поскольку функция не имеет неявного указателя this. Чтобы получить доступ к члену экземпляра, объявите функцию с параметром, который является указателем экземпляра или ссылкой.

Похоже, вы просто не хотите объявлять член статическим.

(Кроме того, мне не нравится описание, в котором говорится, что оно «совместно используется всеми экземплярами класса» — я предпочитаю идею о том, что оно не относится к какому-либо конкретному экземпляру класса. Любой экземпляры созданы вообще.)

ответ дан 16 окт ’12, 13:10

для моей домашней работы требуется, чтобы это был статический метод, так есть ли способ связать их? — Хен Айк Хви

@HengAikHwee: Звучит как странное требование. Можете ли вы изменить подпись, чтобы взять ссылку на экземпляр? Не могли бы вы вместо этого вернуть новый экземпляр? — Джон Скит

Хм, вы имеете в виду данные LocationData; data.sunType = тип солнца; ? — Хен Айк Хви

@HengAikHwee: Хорошо что-то вот так — хотя это довольно странно для метода, называемого compute. в любом случае изменить данные внутри объекта. Трудно помочь вам, не зная, чего вы пытаетесь достичь. Почему вы пытаетесь использовать this вообще? — Джон Скит

Я пытаюсь сделать базу вычислений на основе 5 пользовательских входов из cin. Будет другой класс, который вызовет это вычисление — Хен Айк Хви

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками c++ static-methods or задайте свой вопрос.

Источник

ошибка при компиляции статическим методом

Заявлено на мой заголовок, пытаясь скомпилировать мой файл с помощью статического метода внутри моего кода.
мой computeCivIndex() пытается получить 5 входных данных от пользователя, сделать расчет и вернуть значение с плавающей запятой обратно.

this.sunType для синтаксиса Java, но для V ++, что я должен использовать, чтобы связать их вместе, если оба имеют одно и то же имя?

В моем коде есть методы getter и setter, а также 2 конструктора, которые слишком длинны для публикации.

Решение

static декларация откладывается от static реализация. Статическая реализация означает, что ваш символ функции доступен только внутри файла, в котором он реализован.

Просто удалите статические перед реализацией функции. Кроме того, статическая функция является функцией класса, в них нельзя получить доступ к нестатическим членам класса. Они предназначены для использования без экземпляра объекта, поэтому нет переменных экземпляра.

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

Ошибка компилятора кажется мне достаточно понятной:

ошибка: «это» недоступно для статических функций-членов

В основном, потому что член static , он не выполняется в контексте конкретного экземпляра типа — поэтому с помощью this внутри метод бессмысленно. Вы делать попробуй использовать this отсюда и ошибка.

Когда вы объявляете функцию-член в объявлении класса, ключевое слово static указывает, что функция является общей для всех экземпляров класса. Статическая функция-член не может получить доступ к члену экземпляра, поскольку у функции нет неявного указателя this. Чтобы получить доступ к члену экземпляра, объявите функцию с параметром, который является указателем экземпляра или ссылкой.

Похоже, вы просто не хотите объявлять участника статичным.

(Кроме того, мне не нравится описание, в котором говорится, что оно «совместно используется всеми экземплярами класса» — я предпочитаю идею о том, что это не характерно для какого-либо конкретного экземпляра класса. любой экземпляры созданы, вообще.)

Источник

virtus

20 / 20 / 9

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

Сообщений: 329

1

26.03.2014, 10:08. Показов 3749. Ответов 12

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


Всем привет!

Подскажите, пожалуйста, почему так писать нельзя:

В хедере объявляю статический метод:

C++
1
2
3
4
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    static DWORD WINAPI ThreadFunction(LPVOID lpParam);

в .срр определяю:

C++
1
2
3
static DWORD WINAPI MainWindow::ThreadFunction(LPVOID lpParam){
 
}

Вот какая ошибка:

error: cannot declare member function ‘static DWORD MainWindow::ThreadFunction(LPVOID)’ to have static linkage [-fpermissive]
static DWORD WINAPI MainWindow::ThreadFunction(LPVOID lpParam){
^

Спасибо.

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Programming

Эксперт

94731 / 64177 / 26122

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

Сообщений: 116,782

26.03.2014, 10:08

12

Эксперт С++

4978 / 3085 / 456

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

Сообщений: 11,164

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

26.03.2014, 10:10

2

В .cpp убери слово static.



0



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 10:18

 [ТС]

3

В .cpp убери слово static.

Так работает, только почему если писать static, то не работает?



0



Эксперт С++

4978 / 3085 / 456

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

Сообщений: 11,164

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

26.03.2014, 10:29

4

Потому что так нельзя писать.



0



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 10:32

 [ТС]

5

Правила объявления и опреления статических методотов, получается. Ок, спасибо!



0



Эксперт по математике/физикеЭксперт С++

2001 / 1332 / 379

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

Сообщений: 3,450

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

26.03.2014, 10:33

6

Ключевое слово static дает указание компилятору разместить в памяти указатель на функцию. Записав это слово дважды вы фактически пытаетесь создать в памяти две функции с одним именем.



1



3254 / 2056 / 351

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

Сообщений: 4,909

26.03.2014, 10:35

7

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

только почему если писать static, то не работает?

static в объявлении класса означает, что метод/поле относится к классу, а не к объекту. static в реализации уже может расцениваться как принадлежность сущности к самому файлу — т.е. предполагается использование internal linkage. Т.е. контексты разные. В вашем случае достаточно объявить метод как static.



0



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 10:41

 [ТС]

8

static в реализации уже может расцениваться как принадлежность сущности к самому файлу — т.е. предполагается использование internal linkage

Спасибо, только не очень понял, что значит принадлежность сущности к самому файлу и internal linkage.

Сущность — это метод? А файл — это .cpp файл или не так?



0



3254 / 2056 / 351

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

Сообщений: 4,909

26.03.2014, 10:56

9

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

Сущность — это метод? А файл — это .cpp файл или не так?

Как static может быть объявлена переменная или функция. Если такое объявление на уровне файла, то при линковке метод/переменная не будут доступны в других файлах.



1



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 10:58

 [ТС]

10

Спасибо! Теперь стало понятно!



0



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 12:12

 [ТС]

11

Всем привет!

Подскажите, пожалуйста,
почему статический метод класса может обращаться только к статическому члену класса?

Спасибо.



0



Эксперт по математике/физикеЭксперт С++

2001 / 1332 / 379

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

Сообщений: 3,450

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

26.03.2014, 12:16

12

Потому что статические методы и поля существуют вне зависимости от того существует ли объект класса их содержащий. Т.е. нестатические даные не существуют до тех пор пока не создан объект класса.



0



20 / 20 / 9

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

Сообщений: 329

26.03.2014, 12:19

 [ТС]

13

Спасибо большое! Разобрался.



0



Hi! I’m getting some errors trying to compile a sketch for arduino. Just by including <WiFiEsp.h> without any other code I’m getting these three errors and I can’t figure out how to solve it.
I appreciate any help I can get!

/Users/Jesper/Documents/Documents/Arduino/libraries/WiFiEsp-master/src/WiFiEsp.cpp:209:44: error: cannot declare member function 'static uint8_t WiFiEspClass::getFreeSocket()' to have static linkage [-fpermissive] static uint8_t WiFiEspClass::getFreeSocket() ^

/Users/Jesper/Documents/Documents/Arduino/libraries/WiFiEsp-master/src/WiFiEsp.cpp:222:54: error: cannot declare member function 'static void WiFiEspClass::allocateSocket(uint8_t)' to have static linkage [-fpermissive] static void WiFiEspClass::allocateSocket(uint8_t sock) ^

/Users/Jesper/Documents/Documents/Arduino/libraries/WiFiEsp-master/src/WiFiEsp.cpp:227:53: error: cannot declare member function 'static void WiFiEspClass::releaseSocket(uint8_t)' to have static linkage [-fpermissive] static void WiFiEspClass::releaseSocket(uint8_t sock) ^

  • Forum
  • General C++ Programming
  • compilatiion error for static member fun

compilatiion error for static member function defination outside class.

Hi ,

I’m new to the c++, please can anyone explain can we define static member function outside the class, as myself trying gives compilation error.

please correct me if i’ve specified wrong syntax.

class A
{
static int count;
public :
A()
{
count ++;
}

static void A::countobjects (void)
{
cout<<«Number of objects=»<<countobj<<endl;
}
};

int A:: count = 0;
main()
{
A test;
A::countobjects();
}

$g++ a.out

class.cpp:30: error: cannot declare member function âstatic void A::countobjects()â to have static linkage

The code works fine for me, except that countobj is not declared anywhere.

You should not use the class qualifier A:: in the declaration of your member function.

If you want to move the definition of your member function outside the class declaration then you add the class qualifier, but you only use the static keyword in the declaration (in the class) and not in the definition:

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
#include <iostream>

class A
{
	static int count;
public:
	A()
	{
		count++;
	}

	// Do  not add A:: qualifier here
	static void countobjects(); // no need for void parameter

};


// define static member data and functions here
// Note, do NOT use the static keyword, only in
// the declaration in the class
int A::count = 0;

void A::countobjects() // no need for void parameter
{
	std::cout << "Number of objects=" << count << std::endl;
}

int main()
{
	A test;
	A::countobjects();
}

Last edited on

Thanks galik,

i was using static prefix in definition part of static member function, removing it solved.

— santosh

Topic archived. No new replies allowed.

Понравилась статья? Поделить с друзьями:
  • Error cannot create service zabbix agent 0x00000430
  • Error cannot create file xampp control ini
  • Error cannot create browserwindow before app is ready
  • Error cannot convert double to double in assignment
  • Error cannot connect to service manager 0x00000005