С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/55: Рейтинг темы: голосов - 55, средняя оценка - 4.76
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
1

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Есть проблема при компиляции кода который использует 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 при предварительным объявлением класса  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.01.2013, 16:29
Ответы с готовыми решениями:

Программа, которая будет добавлять структуры заказчиков в стек и удалять из стека, представленного объявлением класса Stack
Здравствуйте! Задание звучит так: Напишите программу, которая будет добавлять структуры...

Проблемы с объявлением функции-члена класса
Доброго времени суток. Пишу программу, реализующую простые матричные операции (сложение, вычитание...

Ошибки "Declaration syntax error" и "Multiple declaration" при компиляции проекта
Optimalnost_Unit.cpp(6): E2141 Declaration syntax error Optimalnost_Unit.cpp(7): E2238 Multiple...

[DCC Error] E2037 Declaration of 'SelectFitFromObzor' differs from previous declaration
Приветствую всех! Возникла проблема, уже всё перепробовал, даже методом тыка! Вот код: ...

8
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.01.2013, 16:34 2
На созданные в typedef идентификаторы заранее сослаться не выйдет. Так что в месте, где проблема, надо было писать
C++
1
template<typename> class base_A;
и пользоваться нормальным именем (или там же его и за typedef'ить).
0
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 16:55  [ТС] 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);
    // ...
В чём тут может быть проблема?
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
03.01.2013, 17:17 4
Есть подозрение, что в этом месте недоступна реализация конструктора base_string(). Одного объявления мало, тут происходит инстанциация шаблона и нужен полный текст.
0
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 17:28  [ТС] 5
После того как закомментировал следующий код:
C++
1
2
3
4
5
template <>
class base_string<wchar_t> {
public:
    base_string(const char *in_add);
};
начало компилироваться, но только вот в чём здесь проблема непонятно для частичной специализации что нужно дублировать все функции основной реализации что-ли или почему из-за этого кода они не находило конструктора?
0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 17:41 6
Цитата Сообщение от popelyuk Посмотреть сообщение
начало компилироваться, но только вот в чём здесь проблема непонятно для частичной специализации что нужно дублировать все функции основной реализации что-ли или почему из-за этого кода они не находило конструктора?
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
0
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:24  [ТС] 7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
0
~ Эврика! ~
1257 / 1006 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 18:33 8
Цитата Сообщение от popelyuk Посмотреть сообщение
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
0
8 / 8 / 2
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:47  [ТС] 9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
ясно, спасибо!
0
03.01.2013, 18:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.01.2013, 18:47
Помогаю со студенческими работами здесь

Ошибка: declaration of 'Init' differs from previous declaration
В низу где procedure procedure TDot.Init(X0,Y0,R0:Integer;Cr:COLORREF); ошибка declaration of...

Ошибка Declaration of 'Button1' differs from previous declaration
Помогите, пожалуйста, исправить ошибку: Declaration of 'Button1' differs from previous declaration...

Описание класса, ошибка "Forward declaration not solved"
Доброго времени суток. Как правильно описывать класс в Лазарусе? type point = class ...

Ошибка при компилировании Declaration terminated incorrectly
Ребят, помогите разобраться. В универе выдали задания с распечаткой похожего кода. Код набрал но...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru