Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,114
Завершенные тесты: 1
1

Undefined reference to "MyClass::DEFAULT_CHANNEL_NUMBER"

11.09.2014, 17:32. Просмотров 1069. Ответов 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" при инклюде внешних классов/библиотек
Используется: Eclipse CDT, MinGW Немного сырцов: #ifndef STACK_H_...

Не собирается проект с шаблонным классом: "undefined reference"
Подскажите пожалуйста, не собирается проект. Пишет &quot;undefined reference to...

У меня ошибка - "undefined reference to `WinMain@16'"
#include &lt;cstring&gt; #include &lt;fstream&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;...

Работа с загаловочными файлами ("Undefined reference to")
Доброго времени суток. Не пойму почему компилятор Code Blocks выдаёт мне...

Работа с шаблонами и ошибка "Undefined reference"
только приступил к изучению шаблонов и сразу куча вопросов и проблем прошу...

13
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 17:45 2
Ни студия (10-я), ни mingw (4.6 - 4.8) не выдают ошибки.
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.09.2014, 17:51 3
Надо добавить определение статической константы и будет хорошо:
C++
1
const unsigned int MyClass::DEFAULT_CHANNEL_NUMBER = 0;
Почему влияет порядок - не очень понял.
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,114
Завершенные тесты: 1
11.09.2014, 17:57  [ТС] 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Почему влияет порядок - не очень понял
я не про порядок, именно, если после ":" поставить 0 то линкуется, если поставить _StackConnectedCmdOutsideIds.rbegin()->first - не линкуется, запись _StackConnectedCmdOutsideIds.rbegin()->first; 100% валидная без тернарного оператора работает
Цитата Сообщение от Tulosba Посмотреть сообщение
Надо добавить определение статической константы
но почему без определения оно работает нормально(строка 18), а именно для специфичной строки отказывается
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.09.2014, 18:08 5
Лучший ответ Сообщение было отмечено aLarman как решение

Решение

Цитата Сообщение от aLarman Посмотреть сообщение
но почему без определения оно работает нормально(строка 18)
Как известно, интегральные статические константные типы можно (и до c++11) инициализировать сразу в классе (даже без дополнительного определения) до тех пор, пока не понадобится получить адрес такой константы.
Как только это потребуется (пользователю явно, или компилятору неявно(вероятно как раз это происходит в тернарном выражении)) происходит ошибка "undefined reference". И нужно добавить определение, чтобы ее избежать.
1
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
11.09.2014, 18:13 6
Цитата Сообщение от Tulosba Посмотреть сообщение
Как только это потребуется (пользователю явно, или компилятору неявно(вероятно как раз это происходит в тернарном выражении)) происходит ошибка "undefined reference".
Tulosba, почему тогда:
Цитата Сообщение от alsav22 Посмотреть сообщение
Ни студия (10-я), ни mingw (4.6 - 4.8) не выдают ошибки.
Реализация тернарного оператора?
1
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
11.09.2014, 18:18 7
Цитата Сообщение от alsav22 Посмотреть сообщение
почему тогда:
Потому что зависит от реализации.
Вот предлагаю на ГК почитать как раз по теме http://govnokod.ru/12669
1
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,114
Завершенные тесты: 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
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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
8466 / 4743 / 1161
Регистрация: 30.01.2014
Сообщений: 7,733
12.09.2014, 20:47 10
aLarman,а можно просто использовать enum:
C++
1
2
3
4
5
class MyClass
{
    enum { DEFAULT_CHANNEL_NUMBER = 0 };
//
};
2
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
12.09.2014, 21:06 11
Цитата Сообщение от DrOffset Посмотреть сообщение
а можно просто использовать enum:
И даже без явного нуля
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,114
Завершенные тесты: 1
15.09.2014, 10:18  [ТС] 12
DrOffset, про enum в курсе) вот кстати вопрос, enum ведь будет преобразовываться при каждом использовании? или нет
0
Tulosba
:)
Эксперт С++
4749 / 3243 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.09.2014, 10:59 13
Цитата Сообщение от aLarman Посмотреть сообщение
enum ведь будет преобразовываться при каждом использовании?
Преобразовываться к чему? У enum'а есть так называемый underlying-type, который по умолчанию есть int.
Или речь о чем-то другом?
0
aLarman
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,114
Завершенные тесты: 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

Code::Blocks. "undefined reference to"
Доброго времени суток! Это опять я :) Столкнулся со следующей проблемой....

Исправить ошибку "undefined reference"
Компилирую в Ubuntu 14.04 Code::Block Есть 3 файла. klass.h initial.cpp...

Ошибка: undefined reference to "omp_set_nested"
#include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include &quot;omp.h&quot; int main() { ...


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

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

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