Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26

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

17.05.2010, 21:37. Показов 1213. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.05.2010, 21:37
Ответы с готовыми решениями:

Перегрузка оператора == и шаблоны
Почему присутствие структуры Hard Logic приводит к ошибке компиляции, а структуры SoftLogic — нет? class Noncomparable{}; struct...

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

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

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

Не по теме:

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

0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
17.05.2010, 23:51
Даемоник, туда же.

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

Или докинуть еще один файл .h с воплощением.
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
18.05.2010, 00:09
Цитата Сообщение от Даемоник Посмотреть сообщение
Roma_F, ну и что? я там нашел только это
сочувствую, но учить читать я не буду
0
2 / 2 / 0
Регистрация: 15.02.2010
Сообщений: 26
18.05.2010, 09:57  [ТС]
Всем спасибо, разобрался до того как прочитал последнии посты), просто оказывается нельзя разделять в шаблонах клаасов сам класс и его реализацию, особенное спасибо Roma_F за ссылку, помогла понять почему именно так надо делать!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.05.2010, 09:57
Помогаю со студенческими работами здесь

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

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

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

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

Перегрузка операторов через шаблоны
Есть класс дробь, переопределил операторы (внутри класса). В таком случае (дробь оператор что-то) работает, но (что-то оператор дробь) -...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru