Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
#1

Conflicting declaration при предварительным объявлением класса - C++

03.01.2013, 16:29. Просмотров 862. Ответов 8
Метки нет (Все метки)

Здравствуйте! Есть проблема при компиляции кода который использует forward declaration для избежания зацикливания хедеров, код выглядит приблизительно следующим образом:

header_b.h
C++
1
2
3
4
5
6
class A; // here is a problem
 
class B {
    opearator const A *();
    // some code ....
};
header_a.h
C++
1
2
3
4
5
6
7
8
template <typename T>
class base_A {
    // class declaration
    // ...
};
 
typedef base_A<type1> some_new_type;
typedef base_A<type2> A;  // here is a problem!!
file_b.cpp
C++
1
2
3
4
5
6
7
#inlcude "header_a.h"
 
B::opearator const A*() {
    // here use the class A
    // some code
    // ...
}
Пробовал заменить:
C++
1
typedef base_A<type2> A;
на
C++
1
class A :public base_A<type2> {};
В таком случае пишет что нет подходящего конструктора:
D:\Dropbox\source\cml\characters.h: 602: error: no matching function for call to 'cml::base_string<wchar_t>::base_string()'
Вот как это всё выглядит в реальном коде:
Миниатюры
Conflicting declaration при предварительным объявлением класса  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 16:29     Conflicting declaration при предварительным объявлением класса
Посмотрите здесь:

Использование объекта одного класса при создании нового класса C++
C++ У меня есть код. Ошибка conflicting type modifiers !
Объявлением типа данных с указателем C++
C++ Загвоздка с объявлением переменной
C++ Программа, которая будет добавлять структуры заказчиков в стек и удалять из стека, представленного объявлением класса Stack
Ошибка при компилировании Declaration terminated incorrectly C++
Классы, разобраться с объявлением объектов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
03.01.2013, 16:34     Conflicting declaration при предварительным объявлением класса #2
На созданные в typedef идентификаторы заранее сослаться не выйдет. Так что в месте, где проблема, надо было писать
C++
1
template<typename> class base_A;
и пользоваться нормальным именем (или там же его и за typedef'ить).
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 16:55  [ТС]     Conflicting declaration при предварительным объявлением класса #3
Цитата Сообщение от Nick Alte Посмотреть сообщение
На созданные в typedef идентификаторы заранее сослаться не выйдет. Так что в месте, где проблема, надо было писать
C++
1
template<typename> class base_A;
и пользоваться нормальным именем (или там же его и за typedef'ить).
Теперь пишет что:
D:\Dropbox\source\cml\exception.cpp:18: error: no matching function for call to 'cml::base_string<wchar_t>::base_string()'
но вот же они конструкторы сто пятьсот штук аж:
C++
1
2
3
4
5
6
7
8
9
10
template <typename type2>
class base_string {
public:
    base_string();
    ~base_string();
    base_string(const base_string<type2> &in_str);
    base_string(const type2 *in_add);
    base_string(int in_val);
    base_string(double in_val);
    // ...
В чём тут может быть проблема?
Nick Alte
Эксперт С++
1603 / 995 / 118
Регистрация: 27.09.2009
Сообщений: 1,918
Завершенные тесты: 1
03.01.2013, 17:17     Conflicting declaration при предварительным объявлением класса #4
Есть подозрение, что в этом месте недоступна реализация конструктора base_string(). Одного объявления мало, тут происходит инстанциация шаблона и нужен полный текст.
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 17:28  [ТС]     Conflicting declaration при предварительным объявлением класса #5
После того как закомментировал следующий код:
C++
1
2
3
4
5
template <>
class base_string<wchar_t> {
public:
    base_string(const char *in_add);
};
начало компилироваться, но только вот в чём здесь проблема непонятно для частичной специализации что нужно дублировать все функции основной реализации что-ли или почему из-за этого кода они не находило конструктора?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 17:41     Conflicting declaration при предварительным объявлением класса #6
Цитата Сообщение от popelyuk Посмотреть сообщение
начало компилироваться, но только вот в чём здесь проблема непонятно для частичной специализации что нужно дублировать все функции основной реализации что-ли или почему из-за этого кода они не находило конструктора?
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:24  [ТС]     Conflicting declaration при предварительным объявлением класса #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 18:33     Conflicting declaration при предварительным объявлением класса #8
Цитата Сообщение от popelyuk Посмотреть сообщение
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2013, 18:47     Conflicting declaration при предварительным объявлением класса
Еще ссылки по теме:

C++ Разница между определением и объявлением переменной
C++ Разобраться с коротеньким объявлением переменной
Удаление экземпляра класса в функции самого класса (Ошибка при отладке) C++
C++ Ошибка при вызове метода класса в методе другого класса
C++ Ошибка при работе с объектом класса в конструкторе другого класса

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

Или воспользуйтесь поиском по форуму:
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:47  [ТС]     Conflicting declaration при предварительным объявлением класса #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
ясно, спасибо!
Yandex
Объявления
03.01.2013, 18:47     Conflicting declaration при предварительным объявлением класса
Ответ Создать тему
Опции темы

Текущее время: 04:05. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru