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

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

Войти
Регистрация
Восстановить пароль
 
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
#1

Аргументы шаблонного метода как объекты - C++

08.07.2013, 00:09. Просмотров 348. Ответов 5
Метки нет (Все метки)

Не могу решить одну задачу.

вот три класса

C++
1
2
3
class win  {};
class obj1 {};
class obj2 {};
Есть класс win, в котором есть функция (я хочу, чтобы она принимела в качестве аргументов указатель либо на obj1, либо на obj2)

C++
1
2
3
4
5
6
7
8
9
10
11
template <class A>
void Window::add_elem(A *elem)
{
        if(typedef(elem) == obj1)  elem->set_parent(this);   // метод из класса obj1 (есть только там)
        if(typedef(elem) == obj2)  elem->show();               // метод из класса obj2 (есть только там)
}
 
win win1;
obj1 object;
 
win1.add_elem(&object);

Я понимаю, что это elem->set_parent(this); неправильно, но как мне добиться желаемого результата?

Добавлено через 4 минуты
Вот ошибки

C++
1
2
3
4
5
6
7
 Object: недопустимое использование этого типа в качестве выражения
см. объявление 'obj1'
см. ссылку на создание экземпляров функции шаблон при компиляции "void win::add_elem<obj1>(A *)"
1>        with
1>        [
1>            A=obj1
1>        ]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.07.2013, 00:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Аргументы шаблонного метода как объекты (C++):

Вызов метода у шаблонного поля, шаблонного класса - C++
Пытаюсь разобраться с шаблонами- задача создать шаблонный класс, у которого есть шаблонное поле. и затем вызывать метод у этого поля. ...

Функция как аргумент шаблонного метода класса - C++
Пытаюсь передать функцию для сравнения в сортировке слиянием, но что-то не получается. Подскажите, как исправить этот код, чтобы сортировка...

Ошибка в определении шаблонного метода - C++
Подскажите пожалуйста, что делаю не так в определении шаблонного метода. Вот код: // test.cpp #include &lt;iostream&gt; #include...

Вызов шаблонного метода в зависимости от условия - C++
#include &lt;iostream&gt; #include &lt;stack&gt; #include &lt;queue&gt; #include &lt;type_traits&gt; template&lt;typename T&gt; class has_front { ...

Вынести реализацию шаблонного метода в cpp - C++
Есть класс с публичным шаблонным методом. В заголовочном файле определен этот метод, а в cpp файле его реализация. Этот метод хочу...

Реализация шаблонного метода с переменным числом параметров - C++
Добрый день! Не могу придумать, как реализовать метод, позволяющий принимать переменное кол-во аргументов. Чтобы понять что именно...

5
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.07.2013, 00:09 #2
Если правильно понял, нужна специализация шаблона:
C++
1
2
3
4
5
6
7
8
9
template <>
inline void Window::add_elem(obj1 *elem) {
   elem->set_parent(this);
}
 
template <>
inline void Window::add_elem(obj2 *elem) {
  elem->show();
}
1
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
08.07.2013, 00:18  [ТС] #3
Цитата Сообщение от gray_fox Посмотреть сообщение
Если правильно понял, нужна специализация шаблона:
C++
1
2
3
4
5
6
7
8
9
template <>
inline void Window::add_elem(obj1 *elem) {
   elem->set_parent(this);
}
 
template <>
inline void Window::add_elem(obj2 *elem) {
  elem->show();
}
Вот написал в самом классе

C++
1
2
3
4
5
6
7
8
9
    template <>
    void add_elem(ob1 *elem)
    {
    }
 
    template <>
    void add_elem(ob2 *elem) 
    {
    }
и вот ошибки

C++
1
2
явная специализация; 'void win::add_elem(ob1*)' не является специализацией функции-шаблона
явная специализация; 'void win::add_elem(obj2 *)' не является специализацией функции-шаблона
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
08.07.2013, 00:24 #4
Нужен сам шаблон метода, что бы его специализировать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class win {
 
   // ...
 
   template<typename T>
   void add_elem(T *);
 
   // ...
};
 
template <>
inline void win::add_elem(ob1 *elem)
{
}
 
template <>
inline void win::add_elem(ob2 *elem) 
{
}
Добавлено через 3 минуты
хотя можно просто перегрузить)
C++
1
2
3
4
5
6
7
8
9
10
class win {
 
   // ...
 
   void add_elem(ob1 * elem) { /* ... */ }
 
   void add_elem(ob2 * elem) { /* ... */ }
 
   // ...
};
1
Egor138
30 / 11 / 2
Регистрация: 10.08.2012
Сообщений: 619
Записей в блоге: 2
08.07.2013, 00:26  [ТС] #5
gray_fox, А вот за это ПРОСТО ОГРОМНОЕ СПАСИБО!!!
Я даже не знал о таких трюках с шаблонами!!!

Спасибо Большое!
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.07.2013, 00:27 #6
delete
0
08.07.2013, 00:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2013, 00:27
Привет! Вот еще темы с ответами:

Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? - C++
header.h template &lt;class T&gt; class MyVector { public: void swap(MyVector&lt;T&gt;Vector); } template &lt;class T&gt; void...

Передача объектов в аргументы метода - C++
Есть программа. Мне нужно было написать несколько перегруженных операторов. Вот собственно весь код: class String{ char *str; ...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Явная специализация метода для типа шаблонного класса - C++
Добрый вечер, уважаемые знатоки! :) Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня есть шаблон некоторого класса: ...


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

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

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