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

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

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
#1

Как быть, если в шаблоне классе предполагается использование ОДИНАКОВЫХ типов? - C++

25.05.2011, 21:37. Просмотров 345. Ответов 3
Метки нет (Все метки)

Вот код, понятно, демонстрационныый, упрощён донельзя для понятности.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <windows.h>
#include <iostream>
using namespace std;
 
template <class T, class t>
class lin_ur {
 public:
  lin_ur (T a, t b){};
  void f(T) {cout<< "Одна функция!"<< endl;};
  void f(t) {cout<<"Совсем другая функция!"<< endl;};
}; 
 
int main(){
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 //lin_ur<double, int> ur_0 (34, 23);
  lin_ur<int, int> ur_0 (34, 23);
}
Всё просто. Но! Предполагается, что типы T и t могут совпадать. (То есть просто расскоменьте строчку lin_ur<int, int> ur_0 (34, 23); и закомменьте предыдущую) А тогда компилятор заявляет , что f не перегружена и вообще он не знает, какую из двух f выбрать, что понятно- типы-то одинаковые. Меж тем хоть прототипы функций В ЭТОМ СЛУЧАЕ и совпадают, содержание их может очень и очень разниться.
Так что, какую функцию вызвать- большая разница.

Как же это сделать, если типы будут совпадать? Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2011, 21:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как быть, если в шаблоне классе предполагается использование ОДИНАКОВЫХ типов? (C++):

итератор в классе-шаблоне - C++
template&lt;class T&gt; class m_vector: public vector&lt;T&gt; { public: T at(int i); m_vector(){} ~m_vector(){} }; template&lt;class T&gt;...

Дружественные функции в классе-шаблоне - C++
stdafx.h #include &lt;iostream.h&gt; template &lt;typename T&gt; class Iterator; template &lt;typename T&gt; class Set ...

Приведение типов в классе - C++
Добрый день всем, кто увлекается. Столкнулся с такой проблемой. Есть класс String (костыль собственного производства). Хочу...

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

Функция приема разных типов в классе - C++
Сразу скажу что надо. Есть функция pow(), так вот она принимает разные типы данных. У меня класс хочу сделать тоже самое. Подскажите как, я...

Раздельная компиляция: как быть, если код не компилируется, так как два файла подключают друг друга? - C++
Доброго времени суток. У меня есть какой-нибудь x.h: #include &quot;y.h&quot; class A { vector&lt;B*&gt; v; } и y.h:

3
lemegeton
2925 / 1354 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
26.05.2011, 10:22 #2
Хм. Похоже, что в С++ такого механизма нет. На ум приходит только либо разделение функций, либо муторная спецификация каждых отдельных классов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// конечно, надо использовать базовый класс, чтобы не переписывать все подряд
template <class A, class B>
class C {
 public:
  void f(A value) {}
  void f(B value) {}
};
 
template <>
class C<int, int> {
 public:
  void f(int) {}
};
Откроете тайну, для чего такое может понадобиться?

P.S. Если найдете красивое решение, не поленитесь отпостить, пожалуйста. )
0
niXman
Эксперт С++
3138 / 1450 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.05.2011, 10:35 #3
так ясен-красен. при одинаковых типах получается две абсолютно одинаковых метода.

расскажите, для чего такое могло понадобиться? возможно есть решение другим путем.

Добавлено через 1 минуту
зы
может тему перенести в "C++ для экспертов" ?
хочу повысить кол-во описанных экспертов на форуме
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,493
26.05.2011, 19:58  [ТС] #4
Да, дело усугубляется тем, что T и t видны только ВНУТРИ класса. Следовательно, такие функции мы можем использовать только внутри класса. Ну, в общем мне в голову не приходит практическое применение сего когда, как придёт отпишусь. Разве что задания типа :

Создайте класс "линейное уравнение". Переопределите в нём унарный минус для коэффициентов a и b, сделав их открытыми. Тогда:

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
25
26
27
#include <windows.h>
#include <iostream>
using namespace std;
 
template <class T, class t>
class lin_ur {
 public:
  lin_ur (T a_0, t b_0, char o): a(a_0), b(b_0), _o(o){};
  void operator-(T) {a*=-1;};
  void operator-(t) {b*=-1;};
 
  T a;
  t b;            
  
  private:
   char _o;          
 
}; 
 
 
int main(){
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 lin_ur<int, int> ur_0 (34, 23, '+');
 
 -ur_0.a;
}
Больше ничё в голову не лезет.
А вообще такая задача встала передо мной, когда я решал корректную задачу. Просто я упрощал код до предела и вот вроде как конечный код нелеп. Если найду более нормальный пример, напишу.
0
26.05.2011, 19:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 19:58
Привет! Вот еще темы с ответами:

Как быть если при перегрузке нужно изменить тип свойства в производном классе? - C#
Здравствуйте, предположим, есть обычный мяч и коробка для него, потом появился специфичный мяч для работы с которым нужно расширить обычную...

(МЕНЮ В ШАБЛОНЕ) Как быть? - WordPress
Доброго Вам времени суток Уважаемые программисты. Я заранее прошу прощения, за глупый вопрос, просто облазил Весь интернет но в итоге...

Сколькими способами можно разбрасывать n одинаковых шаров по разным лузах, если лузы не могут быть пустыми? - Комбинаторика
Будьте добры, помогите, вопрос в названии.

Как в классе Thread реализован вызов run(), если метод run() определён в АВТОРСКОМ классе? - Java
И, следовательно, в классе Thread ничего не известно о вызове run? То есть, ребята, мне пришла в голову мысль. Коль скоро самый...


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

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

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