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

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

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

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

25.05.2011, 21:37. Просмотров 333. Ответов 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 выбрать, что понятно- типы-то одинаковые. Меж тем хоть прототипы функций В ЭТОМ СЛУЧАЕ и совпадают, содержание их может очень и очень разниться.
Так что, какую функцию вызвать- большая разница.

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

итератор в классе-шаблоне - 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++
Сразу скажу что надо. Есть функция pow(), так вот она принимает разные типы данных. У меня класс хочу сделать тоже самое. Подскажите как, я...

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

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

Сколько может быть конструкторов в классе? - C++
Только один или можно больше?

Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов) - C++
собсно #include &lt;windows.h&gt; #include &lt;stdio.h&gt; #include &lt;vector&gt; #include &lt;list&gt; #include &lt;algorithm&gt; #include &lt;cxxabi.h&gt; ...

Нюанс с dynamic_cast: может ли указанное приведение типов быть корректным? - C++
Может ли такое приведение типов (второй dynamic_cast) быть корректным?:class A {public: virtual ~A() {}}; class B : private virtual A...

Использование char в классе - C++
4. Как сделать все тоже самое(с пункта 1 по 3) но чтобы это были константные значения которые в дальнейшем нельзя изменить? 1. как...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
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. Если найдете красивое решение, не поленитесь отпостить, пожалуйста. )
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.05.2011, 10:35     Как быть, если в шаблоне классе предполагается использование ОДИНАКОВЫХ типов? #3
так ясен-красен. при одинаковых типах получается две абсолютно одинаковых метода.

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

Добавлено через 1 минуту
зы
может тему перенести в "C++ для экспертов" ?
хочу повысить кол-во описанных экспертов на форуме
kravam
быдлокодер
1691 / 878 / 44
Регистрация: 04.06.2008
Сообщений: 5,423
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;
}
Больше ничё в голову не лезет.
А вообще такая задача встала передо мной, когда я решал корректную задачу. Просто я упрощал код до предела и вот вроде как конечный код нелеп. Если найду более нормальный пример, напишу.
Yandex
Объявления
26.05.2011, 19:58     Как быть, если в шаблоне классе предполагается использование ОДИНАКОВЫХ типов?
Ответ Создать тему
Опции темы

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