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

Перегрузка оператора [] и шаблоны. - C++

Восстановить пароль Регистрация
 
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
17.05.2010, 21:37     Перегрузка оператора [] и шаблоны. #1
Всем доброго времени суток!

Проблема такая: есть класс сVector

C++
1
2
3
4
5
6
7
8
9
10
template <class T, int Size>
class cVector
{
    T *m_data;
 
public:
    cVector();
    ~cVector();
    T &operator[](int index);
};
Его методы описанны так:

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
template <class T, int Size>
cVector<T, Size>::cVector()
{
    m_data = new int [Size];
}
 
template <class T, int Size>
cVector<T, Size>::~cVector()
{
    delete [] m_data;
}
 
template <class T, int Size>
T &cVector<T, Size>::operator[](int index)
{
    if(index < 0)
    {
        MessageBox(0, L"Error: Index < 0!", "Error", MB_OK);
 
        return m_data[0];
    }
    if(index > Size)
    {
        MessageBox(0, L"Error: Index > Size!", "Error", MB_OK);
 
        return m_data[0];
    }
 
    return m_data[index];
}
В майне:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include "Vector.h"
 
void main()
{
    cVector<int, 10> a();
 
    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }
 
    int i;
    std::cin >> i;
}
При попытки компелировать выдает ошибку:

error C2109: для индекса требуется массив или указател

В чём причина?

Добавлено через 46 минут
А если я чуток меняю майн:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    cVector<int, 10> a; // поменял тут, было так cVector<int, 10> a();
 
    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }
 
    int i;
    std::cin >> i;
}
То получаю кучу неразрешённых ссылок:

1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::~cVector<int,10>(void)" (??1?$cVector@H$09@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int & __thiscall cVector<int,10>::operator[](int)" (??A?$cVector@H$09@@QAEAAHH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::cVector<int,10>(void)" (??0?$cVector@H$09@@QAE@XZ) в функции _main

Люди подскажите в чём проблема?

Добавлено через 33 секунды
А если я чуток меняю майн:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    [COLOR="Red"]cVector<int, 10> a; // поменял тут, было так cVector<int, 10> a();[/COLOR]
 
    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }
 
    int i;
    std::cin >> i;
}
То получаю кучу неразрешённых ссылок:

1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::~cVector<int,10>(void)" (??1?$cVector@H$09@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int & __thiscall cVector<int,10>::operator[](int)" (??A?$cVector@H$09@@QAEAAHH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::cVector<int,10>(void)" (??0?$cVector@H$09@@QAE@XZ) в функции _main

Люди подскажите в чём проблема?

Добавлено через 43 секунды
А если я чуток меняю майн:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void main()
{
    [COLOR="Red"]cVector<int, 10> a; // поменял тут, было так cVector<int, 10> a();[/COLOR]
 
    for(int i = 0; i < 10; i++)
    {
        a[i] = i + 1;
    }
 
    int i;
    std::cin >> i;
}
То получаю кучу неразрешённых ссылок:

1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::~cVector<int,10>(void)" (??1?$cVector@H$09@@QAE@XZ) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: int & __thiscall cVector<int,10>::operator[](int)" (??A?$cVector@H$09@@QAEAAHH@Z) в функции _main
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall cVector<int,10>::cVector<int,10>(void)" (??0?$cVector@H$09@@QAE@XZ) в функции _main

Люди подскажите в чём проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2010, 21:37     Перегрузка оператора [] и шаблоны.
Посмотрите здесь:

перегрузка операторов и шаблоны C++
Перегрузка оператора = C++
C++ Перегрузка и шаблоны
C++ Шаблоны перегрузка ввода/вывода
Шаблоны классов, перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
17.05.2010, 22:56     Перегрузка оператора [] и шаблоны. #2
#include "Vector.cpp"
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
17.05.2010, 23:39     Перегрузка оператора [] и шаблоны. #3
Эм, и куда по-Вашему это надо подключать? У автора правильно написано
C++
1
#include "Vector.h"
И почему-то мне кажется, что не с этим проблемы, сам сейчас попробовал запустить, та же беда с компоновкой

Не по теме:

Больше всего не люблю подобного вида ошибки, они на мой взгляд самые трудно воспринимаемые и решаемые..

Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
17.05.2010, 23:51     Перегрузка оператора [] и шаблоны. #4
Даемоник, туда же.

Цитата Сообщение от Даемоник Посмотреть сообщение
У автора правильно написано
...
самые трудно воспринимаемые и решаемые..
http://www.rsdn.ru/article/cpp/templmod.xml
Даемоник
 Аватар для Даемоник
41 / 41 / 3
Регистрация: 22.05.2009
Сообщений: 97
18.05.2010, 00:05     Перегрузка оператора [] и шаблоны. #5
Roma_F, ну и что? я там нашел только это
C++
1
2
// "подключение" определения
#include "Tstack.h"
Если я правильно понял, надо добавить прототипы в main(), а не подключить Vector.cpp, как это предлагаете сделать Вы.

Или докинуть еще один файл .h с воплощением.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
18.05.2010, 00:09     Перегрузка оператора [] и шаблоны. #6
Цитата Сообщение от Даемоник Посмотреть сообщение
Roma_F, ну и что? я там нашел только это
сочувствую, но учить читать я не буду
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2010, 09:57     Перегрузка оператора [] и шаблоны.
Еще ссылки по теме:

Перегрузка оператора -> C++
C++ Шаблоны и перегрузка различных операторов
C++ Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне

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

Или воспользуйтесь поиском по форуму:
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
18.05.2010, 09:57  [ТС]     Перегрузка оператора [] и шаблоны. #7
Всем спасибо, разобрался до того как прочитал последнии посты), просто оказывается нельзя разделять в шаблонах клаасов сам класс и его реализацию, особенное спасибо Roma_F за ссылку, помогла понять почему именно так надо делать!!!
Yandex
Объявления
18.05.2010, 09:57     Перегрузка оператора [] и шаблоны.
Ответ Создать тему
Опции темы

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