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

Не могу определить ошибку (конкретизация шаблонной функции) - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ строка http://www.cyberforum.ru/cpp-beginners/thread453122.html
Всем привет! Есть вопрос: Создать класс Time для работы со временем в формате «час:минута:секунда». Класс должен включать в себя функциию инициализации строкой (например, «23:59:59»). Помогите пожалуйста реализовать, а то неправильно получается((
C++ Алгоритмы замещения страниц(STL, вторая попытка) Помогите пожалуйста найти ошибку в алгоритме, вроде все правильно работает, но иногда при разных входных данных возникает ошибка. Так вот, решил реализовать алгоритм замещения страниц "Вторая попытка". Коротко о задаче, имеется память ограниченного размера, в память на вход подаются страницы, алгоритм подобен FIFO, отличие в том, что если страница есть в памяти, то она переводится в конец... http://www.cyberforum.ru/cpp-beginners/thread453116.html
Почему for_each() не выводит кирилицу C++
Вот такой код: #include <iostream> #include <string> #include <vector> #include <algorithm> void show(const std::string & s); int main() { using namespace std; setlocale(0, "");
C++ Перевод из одной системы счисления в другую.
Мне задали сделать калькулятор для программиста на языке С. В нем требуется выполнение операций только целые числа, 4 арифметических действия, битовые операции | & ~ ^, перевод в 8,10,16,2 систему исчисления. Вопрос: Есть ли функции в С которые осуществляют перевод в 8,10,16,2 систему исчисления? Какие это функции, как их использовать. P.S. Если вы уже делали такой калькулятор, выложите...
C++ Числа - близнецы http://www.cyberforum.ru/cpp-beginners/thread453065.html
В массиве простых чисел определить наличие чисел-близнецов (11-13; 7-5; 3-5)
C++ функция вывода системного времени Всем привет! Необходимо написать функцию вывода текущего системного времени Вот слепил, а не работает: void InitTime(Time& time) { time_t rawtime; struct tm *timeinfo; time(&rawtime); подробнее

Показать сообщение отдельно
DU
1478 / 1054 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
29.02.2012, 22:21     Не могу определить ошибку (конкретизация шаблонной функции)
... а можно ли ваш пример что бы с char* работал, а не с char
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
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
 
template <typename T>
class X
{
public:
  void f(const T& a, const T& b);
};
 
template <typename T>
void X<T>::f(const T& a, const T& b)
{
  std::cout << "common" << std::endl;
}
 
template <>
class X<char*>
{
public:
  // Эта сигнатура отличается от сигнатуры обобщенного варианта. Это я описал уже.
  void f(const char* a, const char* b);
};
 
void X<char*>::f(const char* a, const char* b)
{
  std::cout << "char*" << std::endl;
}
 
int main()
{
  int i = 0;
  char* c = 0;
 
  X<int> xInt;
  xInt.f(i, i);
  X<char*> xChar;
  xChar.f(c, c);
 
  return 0;
}
И нужно ли если описывать специализированный класс для char*, описывать в классе все функции и заново определять все функции для этого класса? Или достаточно только myCompare?
Да, нужно будет все функции заново сделать. Но если в вашем случае для указателей на чары специфичный только один метод, а все остальные обощие, то так делать не удобно. Лучше воспользоваться классом стратегией для сравнения. Это может быть как внутренний класс, невидимый ни для кого, так и внешний. Если внешний, то он может как передаваться в шаблон, так и не передаваться. Последний случай самый простой и выглядеть это будет примерно так:

Вместо переписывание всех функций заново, достаточно кастомизировать лишь одну функцию сравнения. И кастомизация эта будет в отдельном шаблонном классе, который можно для чаров как раз и специализируется. Класс удобен тем, что в него можно добавить кастомизацию другой еще одной функции, если же этого не надо, то достаточно будет одной шаблонной функции для общего случая и семейства нешаблонных функций для частных случаев.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
 
template <typename T>
struct XTraits
{
  typedef T Type;
 
  static void Compare(const Type& a, const Type& b)
  {
    std::cout << "Common compare" << std::endl;
  }
};
 
template <>
struct XTraits<char*>
{
  typedef char* Type;
 
  static void Compare(const Type& a, const Type& b)
  {
    std::cout << "char* compare" << std::endl;
  }
};
 
template <typename T>
class X
{
public:
  //... Тут куча обобщенных функций
 
  // A вот эта специальная:
  void Compare(const T& a, const T& b)
  {
    XTraits<T>::Compare(a, b);
  }
};
 
int main()
{
  int i = 0;
  char* c = 0;
 
  X<int> xInt;
  xInt.Compare(i, i);
  X<char*> xChar;
  xChar.Compare(c, c);
 
  return 0;
}
 
Текущее время: 02:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru