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

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

Войти
Регистрация
Восстановить пароль
 
vlad3996
6 / 6 / 3
Регистрация: 27.10.2013
Сообщений: 14
#1

Специализация шаблона для char * (рабочий код, но непонятно почему) - C++

17.03.2014, 16:49. Просмотров 380. Ответов 5
Метки нет (Все метки)

Явное определение специализации – это такое определение, в котором за ключевым словом template
следует пара угловых скобок <>, а за ними –определение специализированного шаблона:
C++
1
2
3
template <> тип_возврата 
функция <параметры шаблона>
(параметры_функции) {реализация}
Тогда почему код работает, когда в параметре шаблона стоит 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
#include <iostream>
using namespace std;
template <class T>
void obmen( T*a, T*b) 
{
    T c;
    c=a;
    a=b;
    b=c;
}
template<> void obmen <char*>( char * a, char * b )  //если поменять на <char>, то всё работает
{
    
    if(strlen(a)==strlen(b))
    {
        char *c=new char[strlen(a)+1];
        strcpy(c,a);
        strcpy(a,b);
        strcpy(b,c);
    }
    else cout<<"Длины не равны!!!"<<endl;
}
 
void main()
{
    setlocale(0,"");
    int a1=3,b1=4;
    char *a=new char [255];
    char *b=new char [255];
    char c[]="11111";
    char d[]="22222";
    cin>>a>>b;
    obmen(a,b);
    obmen(c,d);
    cout<<endl<<a<<endl<<b<<endl;
    cout<<endl<<c<<endl<<d<<endl;
    system("pause");
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2014, 16:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Специализация шаблона для char * (рабочий код, но непонятно почему) (C++):

Почему не срабатывает специализация шаблона? - C++
#include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; struct box { char mak; float m; float n; float y; float...

Почему не создается специализация шаблона функции - C++
Почему это не работает и как правильно определить operator&lt;&lt; вне тела класса? #include &lt;iostream&gt; using namespace std; template...

Специализация шаблона для стандартных типов - C++
Пишу динамическую структуру данных (не суть важно какую, допустим для простоты стек). Она работает с объектами типа Box, которые: 1....

Явная специализация шаблона для пользовательского типа - C++
Здравствуйте! Сразу извиняюсь если вопрос покажется глупым, перечитал справочник по шаблонам, но так и не нашёл ответ. Есть шаблон класса: ...

Для чего нужна частичная специализация шаблона класса? - C++
Доброго времени суток объясните пожалуйста зачем нужна частичная специализация шаблонов класса

Специализация шаблона - C++
Здравствуйте! Задача: Создайте шаблонную функцию maxn(), которая принимает в качестве аргумента массив элементов типа Т и целое...

5
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.03.2014, 17:16 #2
Специализация не соответствует шаблону.

Сделайте такой шаблон, например
C++
1
2
3
4
5
6
7
8
template <class T>
void obmen( T a, T b)
{
    T c;
    c=a;
    a=b;
    b=c;
}
1
vlad3996
6 / 6 / 3
Регистрация: 27.10.2013
Сообщений: 14
17.03.2014, 17:17  [ТС] #3
Тогда сам шаблон перестанет работать т.к. значение не по ссылке передается или указателю передаётся =(

upd. а ( T &a, T &b) - та же ошибка
0
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
17.03.2014, 17:31 #4
перегрузите функцию и всё:
C++
1
2
3
void obmen( char * a, char * b ){
//...
}
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
17.03.2014, 19:18 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от vlad3996 Посмотреть сообщение
Тогда сам шаблон перестанет работать т.к. значение не по ссылке передается или указателю передаётся
То есть хочешь сказать, что такой код не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template <class T>
void obmen(T a, T b)
{
    T c;
    c=a;
    a=b;
    b=c;
}
template<>
void obmen <char*>(char * a, char * b )
{
    //....
}
Добавлено через 5 минут
Цитата Сообщение от vlad3996 Посмотреть сообщение
C++
1
template<> void obmen <char*>( char * a, char * b ) *//если поменять на <char>, то всё работает
А в чем собственно проблема? Поменяй и работай спокойно.
У тебя у основного шаблона задано
C++
1
T * a, T * b
Если заменить T = char, то как раз и получится char * - искомая специализация. Если же, как у тебя, заменять T = char *, то специализация будет уже такой - char **.
1
vlad3996
6 / 6 / 3
Регистрация: 27.10.2013
Сообщений: 14
17.03.2014, 19:31  [ТС] #6
DrOffset, спасибо, разобрался =)
Действительно получается char** если использовать ту специализацию
0
17.03.2014, 19:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 19:31
Привет! Вот еще темы с ответами:

Специализация шаблона - C++
Привет, у меня есть вот такой шаблон дерева: template &lt;typename T = int&gt; class Tree{ struct TreeItem{ // элемент дерева ...

специализация шаблона - C++
начал разбираться с шаблонами. если есть структура, и одна функция именно с int должна работать по особенному, написать можно вот так. ...

Специализация шаблона - C++
Пытаюсь специализировать шаблон для типа float, но не получается. В чем проблема? Компилятор: 1&gt;TemplateArr.obj : error LNK2005:...

Частичная специализация шаблона - C++
Доброго всем времени суток! Помогите разобраться в следующей ситуации. Есть шаблон класса #include &lt;iostream&gt; using...


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

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

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