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

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

Войти
Регистрация
Восстановить пароль
 
-Xeon-
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
#1

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

17.05.2010, 21:37. Просмотров 716. Ответов 6
Метки нет (Все метки)

Всем доброго времени суток!

Проблема такая: есть класс с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

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

Шаблоны и дружественность. Перегрузка оператора << через дружественную функцию в шаблоне - C++
Доброго времени суток, уважаемые форумчане! Есть класс-шаблон, реализующий объект &quot;Матрица&quot;. Для него перегружены некоторые операторы....

Перегрузка и шаблоны - C++
Для каждого пункта задания создать: 1. Перегружаемые функции для типов int и double 2. Шаблоны функций Все необходимые данные для...

перегрузка операторов и шаблоны - C++
#include &lt;iostream&gt; using namespace std; template &lt;class X, int size&gt; class type { X mas; public: type() { for(int i =...

Перегрузка и шаблоны функций - C++
Добрый день. Приведенную нижу задачу нужно оформить в виде шаблонов функций. В одномерном массиве, состоящем из n вещественных элементов,...

Шаблоны и перегрузка различных операторов - C++
Не могу правильно описать шаблон при перегрузке операторов. Добился того,что не видит ошибок..но при компиляции ругается и выдаёт...

Шаблоны перегрузка ввода/вывода - C++
#include &lt;iostream&gt; #include &lt;assert.h&gt; #include &lt;stdlib.h&gt; using namespace std; template &lt;class T&gt; class Array { ...

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

Не по теме:

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

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

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

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

Шаблоны классов, перегрузка операторов - C++
Задание:Реализовать шаблон классов Array. Перегрузить операторы присваивания =, ввода &gt;&gt; и вывода &lt;&lt; (предусмотреть обработку ошибок...

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

Перегрузка оператора - C++
#include &lt;iostream&gt; class Node { public: char *s; int length; Node * next; public: Node(); Node(char* val) {

Перегрузка оператора - C++
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой строке: postfix ‘const Counter...


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

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

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