Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
#1

Friend - класс шаблон - C++

08.01.2011, 19:11. Просмотров 1636. Ответов 18
Метки нет (Все метки)

Подскажите, пожалуйста, почему Visual C++ 2010 Express нормально компилирует код
http://www.cyberforum.ru/cpp-beginners/thread1105306.html
C++
1
2
3
4
5
6
7
8
9
template <class NODETYPE> class QueueNode
{
       ...
       template <class NODETYPE> friend class Queue;
};
template <class NODETYPE> class Queue
{
     ...
}
а MinGw версии 5,1,6 и последней версии - нет. Как-то неправильно объявляю друга? А как правильно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 19:11
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Friend - класс шаблон (C++):

Класс friend
Проблемка с доступом через дружественный класс: class Game { friend...

Перегрузка операторов, friend или нет friend?
Всем здравствуйте. Есть такой вопрос: при перегрузке операторов в классе(пусть...

Ошибка при компиляции:"C2955 "Tree": для использования класс шаблон требуется список аргументов шаблон"
Есть класс бинарного дерева, в нем структура. Класс - Tree, структура -...

Friend для friend
всем доброго времени суток, покажу проблему на примере: Class B; class A{...

Класс-шаблон
Создать класс-шаблон, содержащий поля для хранения одномерного массива и...

18
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
08.01.2011, 20:38 #2
AlexRyzhenko, Определитть класс Queue заранее. Неполное объявление класса.
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
08.01.2011, 22:52  [ТС] #3
ForEveR, можно подробней?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
09.01.2011, 09:55 #4
Но вообще как-то не логично. Зачем узел очереди - друг очереди?) Разве это не ее составная часть?)

C++
1
2
3
4
5
6
7
8
9
10
11
template <class NODETYPE> class Queue;
 
template <class NODETYPE> class QueueNode
{
       ...
       template <class NODETYPE> friend class Queue;
};
template <class NODETYPE> class Queue
{
     ...
};
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 17:25  [ТС] #5
ForEveR, так как Вы предлогаете не компилится. Компилится только если написать так
C++
1
friend class Queue <NODETYPE>;
Кстати, в примере у Дейтелов так и есть. Ну, в принципе это ладно, если всё написано правильно и в vs компилится, хотя нужно разобраться почему.
Что касается того, почему дружественная - делаю как в примере, хотя, наверно, стоит элемент сделать частью... Спасибо.

Добавлено через 1 час 19 минут
Теперь я не пойму как обращаться к классу QueueNode. Если, например, метод класса Queue возвращает указатель на объект класса QueueNode, то что писать в объявлении и в определении метода?
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 17:26 #6
Поддерживаю ForEveRа, например, такая структура очереди была бы логичнее:

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
template< typename T >
struct Node
{
    T _data;
    Node *_next;
 
    Node(T data): _data(data), _next(0) { }
};
 
template< typename T >
class Queue
{
public:
    Queue(): _first(0), _last(0) { }
    
    bool is_empty() { return _first == 0; }
 
    void push(T);
    T pop() const;
 
private:
    Node *_first;
    Node *_last;
};
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:17  [ТС] #7
silent_1991, я не понял чем моя отличается от Вашей, кроме того, что один элемент у Вас не как класс, а как структура.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 18:39 #8
AlexRyzhenko, ну, вашу очередь я не видел. Но у меня нет никаких друзей. Почему узел - это друг очереди? Это как вагон - друг поезда. Т.е. абсурдно. Друг нужен, чтобы один класс (в случае классов-друзей) имел доступ к закрытым элементам своего друга. Только вот зачем узлу иметь доступ к элементам обёртки? Узлу надо выполнять свою основную функцию - хранить данные и помнить о своём соседе (или соседях). У него даже никаких методов быть не должно - ему выполнять нечего.

Добавлено через 1 минуту
А, всё, понял. У вас наоборот, обёртка - друг узла. Да, тогда разницы нет, у меня просто все данные изначально открыты, поскольку узел - структура.
1
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 18:44  [ТС] #9
Я ввёл класс QueueNode в класс Queue. Если отказаться от функции возвращающей указатель, то в vs нормально, а MinGW пишет:
template.h:4:14: error: declaration of 'class NODETYPE'
template.h:2:11: error: shadows template parm 'class NODETYPE'
Посмотрите, пожалуйста, исходники.
0
Вложения
Тип файла: rar template.rar (2.3 Кб, 15 просмотров)
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 19:21 #10
У вас типы в шаблонах повторяются. Во вложенном классе опишите тип как _NODETYPE, ну или вообще другим именем.
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 19:30  [ТС] #11
silent_1991, да так нормально. Спасибо. Мне ещё интересно, как определить конструктор за пределами класса? В чём там фишка?
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 19:35 #12
Как и любую другую функцию - через оператор разрешения области действия ::

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class foo
{
public:
    foo(int = 0);
 
private:
    int _a;
};
 
foo::foo(int a):
_a(a)
{
}
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 20:41  [ТС] #13
Нет. Конструктор класса QueueNode.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 20:46 #14
AlexRyzhenko, а у него что, какие-то особенности есть, которых в других конструкторах нету?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class foo
{
    class bar
    {
    public:
        bar(int = 0);
 
    private:
        int _b;
    };
};
 
foo::bar::bar(int b):
_b(b)
{
}
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 23:04  [ТС] #15
Что я запутался с параметрами. Конструктор определить не получается. В примере легче. Вот что я пищу:
C++
1
2
3
template <class NOPDETYPE> Queue<NODETYPE>::QueueNode<_NODETYPE>::QueueNode(const _NODETYPE info)
{
}
И vs подчёркивает всю внутренность и ощибки пишет
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 23:21 #16
Так, секунду... А вам обязательно класс QueueNode делать шаблонным? Не правильнее ли так:

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
template< typrname T >
class Queue
{
public:
    // Методы Queue
 
private:
    class QueueNode
    {
    public:
        QueueNode(const T &);
 
        // Методы QueueNod
 
    private:
        T _data;
    };
};
 
template< typename T >
Queue< T >::QueueNode::QueueNode(const T &data):
_data(data)
{
}
Т.е. у нас же узел очереди будет содержать данные того типа, который определяется при создании самой очереди. Пользователь-то про QueueNode ничего не знает. И тип ему давать не надо, надо тип только для Queue определить, а дальше и QueueNode может этот тип использовать.
0
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
09.01.2011, 23:37  [ТС] #17
Нет так тоже самое. Обычно знаете в vs пишешь :: или точку и появляется список и теперь там класса вообще нет.
0
silent_1991
Эксперт С++
5007 / 3065 / 270
Регистрация: 11.11.2009
Сообщений: 7,043
Завершенные тесты: 1
09.01.2011, 23:39 #18
Вот тот вариант, что я вам привёл, написан в MSVS2010 - всё работает.

Добавлено через 30 секунд
Мда... Там, в начале - typename естественно))
1
AlexRyzhenko
0 / 0 / 1
Регистрация: 29.07.2009
Сообщений: 119
10.01.2011, 00:18  [ТС] #19
Работает, если определять конструктор в том же файле. А если в другом.....

Добавлено через 3 минуты
Нет это только у vs такие заскоки. MinGW норм. Наверно просто спать пора)

Добавлено через 9 минут
О, все!!! Работает!!! Всем СПАСИБО!
0
10.01.2011, 00:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2011, 00:18
Привет! Вот еще темы с решениями:

Класс-шаблон
Создать класс-шаблон, содержащий поля для хранения одномерного массива и...

Класс-Шаблон
В файле input1.txt - находятся числа в 10 с\с и лексемы. Реализовать: ...

Шаблон класс
Не очень шарю в шаблонах. Мне нужно впихнуть функцию Crc8 в шаблон класса...

класс-шаблон
Создать класс-шаблон, содержащий поля для хранения одномерного массива и...


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

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

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