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

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

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

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

03.01.2013, 16:29. Просмотров 942. Ответов 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 при предварительным объявлением класса
Посмотрите здесь:

Программа, которая будет добавлять структуры заказчиков в стек и удалять из стека, представленного объявлением класса 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++
Драсьте, возник небольшой вопрос по теории, дано вот такое объявление, а вместе с этим и определение: static const short* const x; ...

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

Объявлением типа данных с указателем - C++
Есть ли какая-то функциональная разница между таким объявлением int* a; и таким int *a

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 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
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 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++
Как лучше? int main() { for (int i = 0; i &lt; 10; i++) { int n = 3; out &lt;&lt; i + n &lt;&lt; ' '; } return 0; ...

Циклы с предварительным условием: вычисление числа Фибоначчи, не превосходящего заранее заданного N - C++
Написать программу вычисления числа Фибоначчи, не превосходящего заранее заданное число N. Числа Фибоначчи вычисляются с помощью следующих...


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

Или воспользуйтесь поиском по форуму:
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 при предварительным объявлением класса
Ответ Создать тему
Опции темы

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