Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
#1

Undefined reference to "MyClass::DEFAULT_CHANNEL_NUMBER" - C++

11.09.2014, 17:32. Просмотров 537. Ответов 13
Метки нет (Все метки)

доброго времени суток, допустим есть класс
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
class MyClass
{
static const unsigned int DEFAULT_CHANNEL_NUMBER = 0;
std::map<unsigned, std::string> _StackConnectedCmdOutsideIds;
unsigned int _iCurrentChannelNumber;
 
public:
unsigned int GetNextChannelNumber()
    {
        const unsigned int MAX_CMD_CHANNEL_NUMBER = !_StackConnectedCmdOutsideIds.empty()?DEFAULT_CHANNEL_NUMBER:_StackConnectedCmdOutsideIds.rbegin()->first;
        /*if(!_StackConnectedCmdOutsideIds.empty())
        {
            MAX_CMD_CHANNEL_NUMBER = _StackConnectedCmdOutsideIds.rbegin()->first;
        }*/
        //const unsigned int MAX_CMD_CHANNEL_NUMBER = _StackConnectedCmdOutsideIds.begin()->first;
        if (_iCurrentChannelNumber >= MAX_CMD_CHANNEL_NUMBER)
        {
            _iCurrentChannelNumber = DEFAULT_CHANNEL_NUMBER;
        }
        else
        {
            _iCurrentChannelNumber += 2;
        }
        return _iCurrentChannelNumber;
    }
}
строка 10
Bash
1
undefined reference to `MyClass::DEFAULT_CHANNEL_NUMBER'
почему так?

Добавлено через 1 минуту
причем если написать(к примеру) так
C++
1
const unsigned int MAX_CMD_CHANNEL_NUMBER = !_StackConnectedCmdOutsideIds.empty()?DEFAULT_CHANNEL_NUMBER:0;
то ошибки линковки нет

Добавлено через 57 минут
gcc version 4.3.2
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 17:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Undefined reference to "MyClass::DEFAULT_CHANNEL_NUMBER" (C++):

"undefined reference" при инклюде внешних классов/библиотек - C++
Используется: Eclipse CDT, MinGW Немного сырцов: #ifndef STACK_H_ #define STACK_H_ template&lt;class T&gt; class...

Не собирается проект с шаблонным классом: "undefined reference" - C++
Подскажите пожалуйста, не собирается проект. Пишет &quot;undefined reference to Unit::Set()&quot; и такое же про Unit::Get(); Unit.h #ifndef...

Работа с загаловочными файлами ("Undefined reference to") - C++
Доброго времени суток. Не пойму почему компилятор Code Blocks выдаёт мне следующий ERROR: Undefined reference to 'summa(int, int) ...

Работа с шаблонами и ошибка "Undefined reference" - C++
только приступил к изучению шаблонов и сразу куча вопросов и проблем прошу объяснить мне на пальцах почему не работает matrix.h ...

Исправить ошибку "undefined reference" - C++
Компилирую в Ubuntu 14.04 Code::Block Есть 3 файла. klass.h initial.cpp main.cpp klass.h #include &lt;iostream&gt; #include...

Code::Blocks. "undefined reference to" - C++
Доброго времени суток! Это опять я :) Столкнулся со следующей проблемой. Есть 5 файлов: main.cpp --- здесь функция int...

13
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 17:45 #2
Ни студия (10-я), ни mingw (4.6 - 4.8) не выдают ошибки.
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.09.2014, 17:51 #3
Надо добавить определение статической константы и будет хорошо:
C++
1
const unsigned int MyClass::DEFAULT_CHANNEL_NUMBER = 0;
Почему влияет порядок - не очень понял.
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
11.09.2014, 17:57  [ТС] #4
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему влияет порядок - не очень понял
я не про порядок, именно, если после ":" поставить 0 то линкуется, если поставить _StackConnectedCmdOutsideIds.rbegin()->first - не линкуется, запись _StackConnectedCmdOutsideIds.rbegin()->first; 100% валидная без тернарного оператора работает
Цитата Сообщение от Tulosba Посмотреть сообщение
Надо добавить определение статической константы
но почему без определения оно работает нормально(строка 18), а именно для специфичной строки отказывается
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.09.2014, 18:08 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от aLarman Посмотреть сообщение
но почему без определения оно работает нормально(строка 18)
Как известно, интегральные статические константные типы можно (и до c++11) инициализировать сразу в классе (даже без дополнительного определения) до тех пор, пока не понадобится получить адрес такой константы.
Как только это потребуется (пользователю явно, или компилятору неявно(вероятно как раз это происходит в тернарном выражении)) происходит ошибка "undefined reference". И нужно добавить определение, чтобы ее избежать.
1
alsav22
5431 / 4826 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 18:13 #6
Цитата Сообщение от Tulosba Посмотреть сообщение
Как только это потребуется (пользователю явно, или компилятору неявно(вероятно как раз это происходит в тернарном выражении)) происходит ошибка "undefined reference".
Tulosba, почему тогда:
Цитата Сообщение от alsav22 Посмотреть сообщение
Ни студия (10-я), ни mingw (4.6 - 4.8) не выдают ошибки.
Реализация тернарного оператора?
1
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
11.09.2014, 18:18 #7
Цитата Сообщение от alsav22 Посмотреть сообщение
почему тогда:
Потому что зависит от реализации.
Вот предлагаю на ГК почитать как раз по теме http://govnokod.ru/12669
1
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
12.09.2014, 09:58  [ТС] #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Надо добавить определение статической константы и будет хорошо
добавил -
Bash
1
error: duplicate initialization of 'MyClass::DEFAULT_CHANNEL_NUMBER'
Добавлено через 17 минут
а норм, вот так сделал
C++
1
2
3
4
5
6
MyClass
{
static const unsigned int DEFAULT_CHANNEL_NUMBER = 0;
//
}
const unsigned int MyClass::DEFAULT_CAHENNEL_NUMBER;
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.09.2014, 10:43 #9
aLarman, имхо лучше так:
C++
1
2
3
4
5
6
MyClass
{
static const unsigned int DEFAULT_CHANNEL_NUMBER; // объявление
//
}
const unsigned int MyClass::DEFAULT_CAHENNEL_NUMBER = 0; // определение и инициализация
1
DrOffset
7506 / 4502 / 1023
Регистрация: 30.01.2014
Сообщений: 7,362
12.09.2014, 20:47 #10
aLarman,а можно просто использовать enum:
C++
1
2
3
4
5
class MyClass
{
    enum { DEFAULT_CHANNEL_NUMBER = 0 };
//
};
2
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
12.09.2014, 21:06 #11
Цитата Сообщение от DrOffset Посмотреть сообщение
а можно просто использовать enum:
И даже без явного нуля
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
15.09.2014, 10:18  [ТС] #12
DrOffset, про enum в курсе) вот кстати вопрос, enum ведь будет преобразовываться при каждом использовании? или нет
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.09.2014, 10:59 #13
Цитата Сообщение от aLarman Посмотреть сообщение
enum ведь будет преобразовываться при каждом использовании?
Преобразовываться к чему? У enum'а есть так называемый underlying-type, который по умолчанию есть int.
Или речь о чем-то другом?
0
aLarman
644 / 565 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
Завершенные тесты: 1
15.09.2014, 12:33  [ТС] #14
Цитата Сообщение от Tulosba Посмотреть сообщение
Преобразовываться к чему?
да я именно про это, т.е при сравнении даже с unsigned int,
и кстати enum имеет такой тип или к int преобразуется при каждом использовании
0
15.09.2014, 12:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2014, 12:33
Привет! Вот еще темы с ответами:

Ошибка "undefined reference to" - C++
Здравствуйте. Пишу набор функций, состоящих из двух файлов: fileio.h и fileio.cpp Попытался подключить это к main.cpp, и использовать...

ошибка "undefined reference" - C++
Изучаю С++ по книге Дейтелов. Работаю в Code Blocks Вот запнулся. Изучаю рекурсию на примере числа Фибоначчи. Пример списан с книги, но у...

G++ undefined reference to `Direct3DCreate9@4'" - C++
в визуале норм компилил.. даже без путей... а G++ отказывается ! выдаёт undefined reference to `Direct3DCreate9@4'&quot; . В чем проблема? //...

Ошибки "system" is ambiguous и identifier "_getch" is undefined - C++
Здравствуйте! Нужна помощь с кодом. В чем заключаются ошибки и как их исправить, или чем заменить:? Подскажите, пожалуйста. ---main...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru