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

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

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

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

25.05.2011, 21:37. Просмотров 322. Ответов 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++ Сколько может быть конструкторов в классе?
Дружественные функции в классе-шаблоне C++
C++ итератор в классе-шаблоне
C++ Как отсортирвоать контейнер, если его тип определяется по ходу выполнения программы? (динамическая идентификация типов)
C++ как быть если учил немецкий?
C++ Чем может быть чревато создание в классе адреса на другой класс
C++ Функция приема разных типов в классе
C++ Приведение типов в классе
Использование char в классе C++
C++ Раздельная компиляция: как быть, если код не компилируется, так как два файла подключают друг друга?
C++ Нюанс с dynamic_cast: может ли указанное приведение типов быть корректным?
C++ Как поступить, если необходимо создать массив экземпляров класса, но в классе нет конструктора по умолчанию?

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

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

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

Добавлено через 1 минуту
зы
может тему перенести в "C++ для экспертов" ?
хочу повысить кол-во описанных экспертов на форуме
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,304
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     Как быть, если в шаблоне классе предполагается использование ОДИНАКОВЫХ типов?
Ответ Создать тему
Опции темы

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