Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
1

Исключение для шаблона

05.05.2013, 13:27. Показов 1624. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте ! У меня следующий вопрос : Есть база данных, написан шаблон ввода для нее
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template <typename T>
        friend std::ostream& operator<<( std::ostream& os, Array<T>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i)<<"\t";
                os<<'\n';
            }
        return os;
        };
        template <typename T>
        friend std::istream& operator>>( std::istream& is, Array<T>& cont){
            int m;
            std::cout<<"Insert Array length";
            T a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new T [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
Охото сделать исключение для шаблона в случае когда T == char , т.е. когда база имен. Просто имена удобнее вводить не посимвольно а целиком. Заранее спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.05.2013, 13:27
Ответы с готовыми решениями:

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt;...

исключение из шаблона
привет. вопрос возможноли сделать исключения из шаблона? строка: sadsdsads4444rerere5555asdsadsada...

Программа выдает исключение: Вызвано исключение: нарушение доступа для чтения. _Pnext было 0xCCCCCCD0
Доброго времени суток. Пишу игру с помощью SFML, и при внедрении события нажатии кнопки Tab...

Как создать закладку для шаблона Word для Delphi
Помогите разобраться как создаются закладки x1, x2, x3 в шаблоне Word.Прост шаблон копирнул,а мне...

13
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 13:40 2
Перегрузка?
C++
1
2
std::ostream& operator<<( std::ostream& os, Array<char> const& cont) { /* ... */ }
std::istream& operator>>( std::istream& is, Array<char>& cont){ /* ... */ }
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 14:20  [ТС] 3
gray_fox, Пробовал. Тогда почему то ругается при вводе нечарового типа
C++ (Qt)
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
template <typename T>
        friend std::istream& operator>>( std::istream& is, Array<T>& cont){
            int m;
            std::cout<<"Insert Array length";
            T a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new T [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
        friend std::ostream& operator<<( std::ostream& os, Array<char>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i);
                os<<'\n';
            }
        return os;
        };
        friend std::istream& operator>>( std::istream& is, Array<char>& cont){
            int m;
            std::cout<<"Insert Name length";
            char a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new char [m];
            for(int i=0;i<m;i++){
                //std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
error C2995: std::ostream &operator <<(std::ostream &,Array<A> &): шаблон функции уже определен
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 14:33 4
Linzman, прямо в шаблоне класса друзей определяешь? Возможно в этом проблема. Вот синтетический пример:
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
#include <iostream>
 
 
template<typename>
struct type {
   
   template<typename T>
   friend void f(type<T>);   
};
 
template<typename T>
void f(type<T>) {
   std::cout << "1" << std::endl;
}
 
void f(type<char>) {
   std::cout << "2" << std::endl;
}
 
 
int main() {
   type<int> t1;
   type<char> t2;
   f(t1);
   f(t2);
}
http://ideone.com/8mXE66 .
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
05.05.2013, 14:39 5
gray_fox, эм...специализация шаблона сопровождается пустым template<>
C++
1
2
3
4
5
6
7
8
9
template<typename T>
void f(type<T>) {
   std::cout << "1" << std::endl;
}
 
template<> 
void f(type<char>) {
   std::cout << "2" << std::endl;
}
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 14:42 6
Jupiter, я перегрузку предлагал. Только перегрузку для char надо тоже другом объявить, забыл.
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 14:43  [ТС] 7
gray_fox,
C++ (Qt)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#pragma once
#include "header.h"
template <typename A> class Array:
    public Container<A>{
    private:
        A* data;
        int length;
    public:
        Array<A>(int n){
        data=new A[n];
        length=n;
        }
        Array<A>(){
            data=new A[0];}
        ~Array<A>(){
        delete[] data;
        }
        void set(int j, A i){
        data[j]=i;
        }
         A get(int j){
        return data[j];
        }
        int len(){
        return length;
        }
        void operator=(Array<A> a){
            delete[] a.data;
            a=Array(length);
            for(int i=0;i<length;i++)
                a.data[i]=data[i];
        }
        Array<A> add(A a,int n){//adds a new A Element to the n position
 
        }
        int find(A a){//returns position and counts of elements inclsions
 
        }
        template <typename T> //Шаблоны работают но если T==char то имена посимвольно вводить неудобно
        friend std::ostream& operator<<( std::ostream& os, Array<T>& cont);
        template <typename T>
        friend std::istream& operator>>( std::istream& is, Array<T>& cont);
        friend std::ostream& operator<<( std::ostream& os, Array<char>& cont);
        friend std::istream& operator>>( std::istream& is, Array<char>& cont);
};
    /*class Group{
    private:
         Array<char>* name;
         Array<char>* last_name;
         int length;
    public:
        void SortByName(){}
        void SortByLastName(){}
        Array<char> GetMember(int n){}
        void SetMember(int n,char* a,char* b){}
        Array<char> ChangeMember(int n,char* a,char* b){}
    }*/
    std::ostream& operator<<( std::ostream& os, Array<char>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i);
                os<<'\n';
            }
        return os;
        };
    std::istream& operator>>( std::istream& is, Array<char>& cont){
            int m;
            std::cout<<"Insert Name length";
            char a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new char [m];
            for(int i=0;i<m;i++){
                //std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
     template <typename T> 
      std::ostream& operator<<( std::ostream& os, Array<T>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i)<<"\t";
                os<<'\n';
            }
        return os;
        };
     template <typename T>
       std::istream& operator>>( std::istream& is, Array<T>& cont){
            int m;
            std::cout<<"Insert Array length";
            T a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new T [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
Теперь компилятор ругается "обнаружен многократно определенный символ - один или более"
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 14:57 8
Linzman, сделать ф-ии с char inline или вынести их реализацию в файл с исходным кодом, если это на стадии компановки.

Добавлено через 7 минут
Вообще, зачем объявлять operator << другом, ведь get и len публичные методы?

Добавлено через 2 минуты
+ перегрузка operator << вроде и не нужна совсем - код идентичный.
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 16:03  [ТС] 9
gray_fox,
Jupiter, Спасибо. Я сделал все как вы говорили. Теперь все выглядит так
C++ (Qt)
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
50
51
52
53
54
55
56
57
class Blabla{
 public:
template <typename T>
friend std::ostream& operator<<( std::ostream& os, Array<T>& cont)
template <typename T>
        friend std::istream& operator>>( std::istream& is, Array<T>& cont)
                       template <>
        friend std::ostream& operator<<( std::ostream& os, Array<char>& cont);
        template <>
        friend std::istream& operator>>( std::istream& is, Array<char>& cont);
}
template <typename T> 
        std::ostream& operator<<( std::ostream& os, Array<T>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i)<<"\t";
                os<<'\n';
            }
        return os;
        };
template <typename T>
        std::istream& operator>>( std::istream& is, Array<T>& cont){
            int m;
            std::cout<<"Insert Array length";
            T a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new T [m];
            for(int i=0;i<m;i++){
                std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
template <>
        std::ostream& operator<<( std::ostream& os, Array<char>& cont){//
            for(int i=0;i<cont.len();i++){
                    os<<cont.get(i);
                os<<'\n';
            }
        return os;
        };
        template <>
    std::istream& operator>>( std::istream& is, Array<char>& cont){
            int m;
            std::cout<<"Insert Name length";
            char a;
            std::cin>>m;
            delete[] cont.data;
            cont.data=new char [m];
            for(int i=0;i<m;i++){
                //std::cout<<"Insert"<<i<<"element";
                is>>a;
                cont.set(i,a);
            }
            return is;
        };
Студия пишет ошибку "operator <<: определение дружественной функции не может быть специализацией функции шаблон". Жду вашего совета
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 16:09 10
Цитата Сообщение от Linzman Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
class Blabla {
// ...
   template <>
   friend std::ostream& operator<<( std::ostream& os, Array<char>& cont);
   template <>
   friend std::istream& operator>>( std::istream& is, Array<char>& cont);
// ...
};
Это лишнее.
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 16:24  [ТС] 11
gray_fox,Убрал эти две строки в классе тогда в описании вне класса оператора std::ostream& operator<<( std::ostream& os, Array<char>& cont) компилятор ругается на то что этот оператор не друг
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 16:28 12
Linzman, эмм. Вот я делаю
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
#include <iostream>
 
 
template<typename>
class type {
   
   void _f() {}
   
   // объявление друга
   template<typename T>
   friend void f(type<T>);   
};
 
// шаблон ф-ии
template<typename T>
void f(type<T> t) {
   t._f();
   std::cout << "1" << std::endl;
}
 
// специализация шаблона ф-ии
template<>
void f(type<char> t) {
   t._f();
   std::cout << "2" << std::endl;
}
 
 
int main() {
   type<int> t1;
   type<char> t2;
   f(t1);
   f(t2);
}
http://ideone.com/qfyRnO
и вроде всё нормально, доступ к закрытым полям объекта есть.
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
05.05.2013, 16:40  [ТС] 13
gray_fox, поставил template<> перед перегруженными операторами, теперь мой код полностью идентичен вашему. Студия ругается что "обнаружен многократно определенный символ - один или более"
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
05.05.2013, 16:49 14
Linzman, сделать специализации inline, или выносить реализацию в исходный файл. С inline
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
#include <iostream>
 
 
template<typename>
class type {
   
   void _f() {}
   
   // объявление друга
   template<typename T>
   friend void f(type<T>);   
};
 
// шаблон ф-ии
template<typename T>
void f(type<T> t) {
   t._f();
   std::cout << "1" << std::endl;
}
 
// специализация шаблона ф-ии
template<>
inline void f(type<char> t) {
   t._f();
   std::cout << "2" << std::endl;
}
 
 
int main() {
   type<int> t1;
   type<char> t2;
   f(t1);
   f(t2);
}
1
05.05.2013, 16:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.05.2013, 16:49
Помогаю со студенческими работами здесь

Подскажите мотивацию для создания шаблона с 0 для joomla
Написал шаблон сам для дипломного проекта,заказчик поставил задачу писать в ручную, а какова...

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. ...

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt;...

Как сделать исключение для функции window.onbeforeunload = function() для конкретной кнопки?
У меня есть страница с формой я подключил вот этот код событию onclick кнопки&quot;сохранить&quot; ...

Редактирование шаблона сайта и шаблона письма
Помогите найти , где и как ? Т.е. уже 3 дня роюсь и не в состоянии найти где убить пару кнопок и...

Исключение EOleError. Как перехватить при удалении записи это исключение ?
Добрый день, Господа. Связал ключем справочник с майн-таблицей на уровне СУБД MySQL. При...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru