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

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

Войти
Регистрация
Восстановить пароль
 
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
#1

Шаблончики, С++. - C++

12.08.2010, 21:46. Просмотров 425. Ответов 8
Метки нет (Все метки)

Доброго Всем времени суток, уважаемые программисты. Начинаю осваивать STL и её реализацию. Собственно, с шаблонами особо раньше не встречался, поэтому решил в них разобраться получше.
А теперь, собственно, вопросы
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
50
51
52
#ifndef _TEMPLATES_H
#define _TEMPLATES_H
template <class T>
class MyClass
{
    protected:
        T value;
        byte memory;
        type argType;
    public:
        MyClass() {value = 0; memory = sizeof(value); argType = type_int;cout << "\nObject created!\n";}
        MyClass(MyClass&);
        ~MyClass() {}
        void fSetVal(T& v) {value = v;}
        void fDefMem() {memory = sizeof(value);}
        MyClass* operator=(const T);
        MyClass* operator=(MyClass&);
        void fGetInfo() { cout << "\nValue: " << value << ", size: " << memory << ", argType: " << argType << ".\n";}
        template <class X>
        MyClass<T>* operator=(MyClass<X>&);
};
template <class T>
MyClass<T>* MyClass<T>::operator=(const T val)
{
    value = val;
    return this;
}
template <class T>
MyClass<T>* MyClass<T>::operator=(MyClass<T>& my)
{
    if(&my == this)
    {
        cout << "\nOPERATOR=(A,A)!\n";
        return this;
    }
    value = my.value;
    return this;
}
template <class T>
MyClass<T>::MyClass(MyClass<T>& my)
{
    value = my.value;
    memory = my.memory;
    argType = my.argType;
    cout << "\nObject created Class(Class)\n";
}
// Крикозябры ниже)
/*template <class T, class X>
MyClass<T>* MyClass<T>::operator=(MyClass<X>& my)
{
    return this;
}*/
Вообщем, решил написать бесполезный код с использованием шаблонов)
Вопрос #1: если в мейне пишу
C++
1
MyClass<int> A;
, то все нормально. Я так понимаю, создается экземпляр моего класса согласно моему конструктору MyClass<T>::MyClass(). Конструкцию же
C++
1
MyClass<int> A();
компилятор глотает, но A становится непонятно чем: не могу применить A.любая_функция_член_или_элемент. Более того не вызывается даже конструктор... В чем дело? IDE MSVS 2010 ULTIMATE.
Вопрос #2:
template <class X>
MyClass<T>* operator=(MyClass<X>&);
Это прототип, насколько я понимаю. При попытке определения функции
template <class T, class X>
MyClass<T>* MyClass<T>::operator=(MyClass<X>& my)
{
....код....
}
компилятор плюется и злобно фыркает Где я ошибся?
Заранее спасибо Всем откликнувшимся!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
12.08.2010, 22:09 #2
Цитата Сообщение от Александр Елис Посмотреть сообщение
MyClass<int> A();
компилятор воспринимает как функцию A(void), которая возвращает MyClass<int>

Добавлено через 5 минут
Цитата Сообщение от Александр Елис Посмотреть сообщение
template <class T, class X>
MyClass<T>* MyClass<T>::operator=(MyClass<X>& my)
{
....код....
}
у вас класс объявлен с другим шаблоном, так не получится, тогда template <class T, class X> нужно делать для всего класс, хотя какой смысл, как это должно работать?
0
Nick Alte
Эксперт С++
1639 / 1011 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
13.08.2010, 15:53 #3
C++
1
2
3
4
5
template <typename T> class MyClass {
...
    template<typename X> MyClass<T>* operator = (const MyClass<X> &my);
...
};
Если хочется реализовать функцию снаружи, пишем так:
C++
1
2
3
4
5
template<typename T> template <typename X>
MyClass<T>* MyClass<T>::operator = (const MyClass<X> &my)
{
...
}
0
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
13.08.2010, 16:12  [ТС] #4
Сообщение от Александр Елис
MyClass<int> A();
компилятор воспринимает как функцию A(void), которая возвращает MyClass<int>
То есть компилятор полагает, что это - прототип новой функции? Но ведь код внутри функции main располагается. Или я неправильно понял?
C++
1
2
3
4
5
template <typename T> class MyClass {
...
    template<typename X> MyClass<T>* operator = (const MyClass<X> &my);
...
};
Идентификатор const обязателен? Его стоит использовать при перегрузке оператра = всегда?
C++
1
2
3
4
5
template<typename T> template <typename X>
// это то же, что и
template <class T> template <class X> 
//? и возможна ли такая запись
template <typename T,typename X>
Разъясни, пожалуйста!
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.08.2010, 16:44 #5
Цитата Сообщение от Александр Елис Посмотреть сообщение
То есть компилятор полагает, что это - прототип новой функции? Но ведь код внутри функции main располагается. Или я неправильно понял?
да, в стандарте с++ есть правило, что все, что синтаксически подходит под объявление функции должно восприниматься как объявление, приблуда плюсов
Цитата Сообщение от Александр Елис Посмотреть сообщение
Идентификатор const обязателен? Его стоит использовать при перегрузке оператра = всегда?
не уверен, с cv-семантиками все сложно, но так всегда поступают, это в некоторой мере гарантирует, что правый операнд (A=B) не будет изменен в результате присваивания
0
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
13.08.2010, 17:14  [ТС] #6
Ясно. Я с третим вопросом что?)
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
13.08.2010, 17:16 #7
Nick Alte, показал как оно возможно должно выглядеть
0
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
13.08.2010, 17:20  [ТС] #8
Ну так я про
C++
1
template<typename T> template <typename X>
это то же, что и
C++
1
template <class T> template <class X>
? и возможна ли такая запись
C++
1
template <typename T,typename X>
0
Somebody
2791 / 1602 / 147
Регистрация: 03.12.2007
Сообщений: 4,199
Завершенные тесты: 1
13.08.2010, 17:56 #9
1) Это и без шаблонов так же
C++
1
2
3
class foo {};
foo bar; // это переменная
foo baz(); // это объявление функции без параметров, возвращающей foo
2) Надо отдельно шаблоны
template <class T> template<class X>
0
13.08.2010, 17:56
Ответ Создать тему
Опции темы

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