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

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

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

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

03.01.2013, 16:29. Просмотров 1042. Ответов 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()'
Вот как это всё выглядит в реальном коде:
0
Миниатюры
Conflicting declaration при предварительным объявлением класса  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2013, 16:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Conflicting declaration при предварительным объявлением класса (C++):

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

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

У меня есть код. Ошибка conflicting type modifiers ! - C++
Помогите разобраться!!! extern void TRLS(String&amp; sStr) { if (pLangSupp != NULL) sStr = pLangSupp-&gt;Translate(sStr); } ...

Загвоздка с объявлением переменной - C++
Всем доброго времени суток. Недавно начал изучать С++ по Дейтелу. Есть такой пример программы, который прерывает цикл при определенном...

Удаление экземпляра класса в функции самого класса (Ошибка при отладке) - C++
Допустим, у нас есть класс Buffer, который хранит в себе указатель на класс некоторой матрицы и количество этих указателей refcounter ...

Ошибка при вызове метода класса в методе другого класса - C++
Господа программисты, возникла такая проблема. При вызове метода класса в методе другого класса выходит такая ошибка &quot; нестандартный...

8
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
03.01.2013, 16:34 #2
На созданные в typedef идентификаторы заранее сослаться не выйдет. Так что в месте, где проблема, надо было писать
C++
1
template<typename> class base_A;
и пользоваться нормальным именем (или там же его и за typedef'ить).
0
popelyuk
8 / 8 / 1
Регистрация: 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
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
03.01.2013, 17:17 #4
Есть подозрение, что в этом месте недоступна реализация конструктора base_string(). Одного объявления мало, тут происходит инстанциация шаблона и нужен полный текст.
0
popelyuk
8 / 8 / 1
Регистрация: 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
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 17:41 #6
Цитата Сообщение от popelyuk Посмотреть сообщение
начало компилироваться, но только вот в чём здесь проблема непонятно для частичной специализации что нужно дублировать все функции основной реализации что-ли или почему из-за этого кода они не находило конструктора?
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
0
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:24  [ТС] #7
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ага. Надо. Такие дела. Частичная специализация шаблона создаёт совершенно новый класс, который может иметь совершенно другой набор полей, методов, наследоваться от чего-то другого и т. д.
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
03.01.2013, 18:33 #8
Цитата Сообщение от popelyuk Посмотреть сообщение
и что никак нельзя сделать так чтобы не дублировать все методы т.к. их там более чем дофига?
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
0
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
03.01.2013, 18:47  [ТС] #9
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Неа. Workaround: вынести изменяемую часть целиком в отдельный класс, в котором методов мало, и зачастичношаблонить уже его, а потом этот класс передать (шаблоном, интерфейсом, как угодн) классу, где методов дофига.
ясно, спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2013, 18:47
Привет! Вот еще темы с ответами:

Ошибка при работе с объектом класса в конструкторе другого класса - C++
Имеется данный код: https://github.com/ubelian/glgame/tree/master/glgame В файле Food.cpp в конструкторе класса Food::Food() на 19...

Использование объекта одного класса при создании нового класса - C++
Добрый вечер. У меня такая проблема. Есть готовый класс L2 - список, на его основе нужно создать дек. Я поступил так: в приватной части...

Разобраться с коротеньким объявлением переменной - C++
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе с этим и определение: static const short* const x; ...

Пр0блема с объявлением функции. Наверное - C++
День всем добрый! Я тут столкнулся с проблемой. Почему ЭТО: pixel = GetPixel( hdc, x, y );


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
03.01.2013, 18:47
Ответ Создать тему
Опции темы

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