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

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

Восстановить пароль Регистрация
 
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
12.08.2010, 21:46     Шаблончики, С++. #1
Доброго Всем времени суток, уважаемые программисты. Начинаю осваивать 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)
{
....код....
}
компилятор плюется и злобно фыркает Где я ошибся?
Заранее спасибо Всем откликнувшимся!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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> нужно делать для всего класс, хотя какой смысл, как это должно работать?
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 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)
{
...
}
Александр Елис
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>
Разъясни, пожалуйста!
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.08.2010, 16:44     Шаблончики, С++. #5
Цитата Сообщение от Александр Елис Посмотреть сообщение
То есть компилятор полагает, что это - прототип новой функции? Но ведь код внутри функции main располагается. Или я неправильно понял?
да, в стандарте с++ есть правило, что все, что синтаксически подходит под объявление функции должно восприниматься как объявление, приблуда плюсов
Цитата Сообщение от Александр Елис Посмотреть сообщение
Идентификатор const обязателен? Его стоит использовать при перегрузке оператра = всегда?
не уверен, с cv-семантиками все сложно, но так всегда поступают, это в некоторой мере гарантирует, что правый операнд (A=B) не будет изменен в результате присваивания
Александр Елис
3 / 3 / 1
Регистрация: 20.05.2010
Сообщений: 50
13.08.2010, 17:14  [ТС]     Шаблончики, С++. #6
Ясно. Я с третим вопросом что?)
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
13.08.2010, 17:16     Шаблончики, С++. #7
Nick Alte, показал как оно возможно должно выглядеть
Александр Елис
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>
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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>
Yandex
Объявления
13.08.2010, 17:56     Шаблончики, С++.
Ответ Создать тему
Опции темы

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