Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/41: Рейтинг темы: голосов - 41, средняя оценка - 4.88
9 / 9 / 3
Регистрация: 03.11.2009
Сообщений: 39

Ошибка: friend declaration declares a non-template function

06.01.2010, 04:53. Показов 8464. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Я корплю над задачкой: нада сделать класс вектор шаблонным, перегрузить операции ввода-вывода, и тд и тп.
Вот с вводом-выводом у меня и проблемы.
Вернее со всеми шестью friend функциями.
Вот код:
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
template <class T, int N> class Vector //int N - template value of vector elements
{
    int size; //current size of vector (number of elements)
    int max; //max number of elements
    T * value;
 
public:
    Vector();
    virtual ~Vector();
    Vector(int max);
    Vector(const Vector<T, N> & v);
 
    int getSize() const;
    void setSize(int size);
 
    T & operator[](int i);
 
    Vector<T, N> & operator=(const Vector<T, N> & v);
 
    bool operator==(const Vector<T, N> & v);
    bool operator!=(const Vector<T, N> & v);
    bool operator>(const Vector<T, N> & v);
    bool operator>=(const Vector<T, N> & v);
    bool operator<(const Vector<T, N> & v);
    bool operator<=(const Vector<T, N> & v);
 
    /*1*/friend const Vector<T, N> & operator+(const Vector<T, N> & v1, const Vector<T, N> & v2);
    /*2*/friend const Vector<T, N> & operator-(const Vector<T, N> & v1, const Vector<T, N> & v2);
    /*3*/friend const Vector<T, N> & operator*(const Vector<T, N> & v1, const Vector<T, N> & v2);
    /*4*/friend const Vector<T, N> & operator/(const Vector<T, N> & v1, const Vector<T, N> & v2);
 
    const Vector<T, N> & operator+=(const Vector<T, N> & v);
    const Vector<T, N> & operator-=(const Vector<T, N> & v);
    const Vector<T, N> & operator*=(const Vector<T, N> & v);
    const Vector<T, N> & operator/=(const Vector<T, N> & v);
 
    /*5*/friend std::istream & operator>>(std::istream & is, Vector<T, N> & v);
    /*6*/friend std::ostream & operator<<(std::ostream & os, const Vector<T, N> & v);
};

На них (на функции 1-6) выдает не ошибку, а предупреждение (я токо хэдер написала еще)
предупреждение такое:

Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"Vector.d" -MT"Vector.d" -o"Vector.o" "../Vector.cpp"
In file included from ../Vector.cpp:8:
../Vector.h:40: warning: friend declaration ‘const Vector<T, N>& operator+(const Vector<T, N>&, const Vector<T, N>&)’ declares a non-template function
../Vector.h:40: note: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here)
../Vector.h:41: warning: friend declaration ‘const Vector<T, N>& operator-(const Vector<T, N>&, const Vector<T, N>&)’ declares a non-template function
../Vector.h:42: warning: friend declaration ‘const Vector<T, N>& operator*(const Vector<T, N>&, const Vector<T, N>&)’ declares a non-template function
../Vector.h:43: warning: friend declaration ‘const Vector<T, N>& operator/(const Vector<T, N>&, const Vector<T, N>&)’ declares a non-template function


Когда гуглила много раз находила, что нада сделать вот такое:
C++
1
2
friend std::istream & operator>> <>(std::istream & is, Vector<T, N> & v);
    friend std::ostream & operator<< <>(std::ostream & os, const Vector<T, N> & v);
но на такую запись выдает не предупреждение а ошибку (хочет сразу за < поставить ; )

Подскажите, пожалуйста, как можно решить эту проблемку?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.01.2010, 04:53
Ответы с готовыми решениями:

Selfpointer inside template friend function
Как получить указатель на нужный класс внутри дружественной фукции? def.h class A { public: template...

Ошибка компиляции: template-id does not match any template declaration
Здравствуйте. Помогите, пожалуйста: #include &lt;iostream&gt; using namespace std; template &lt;typename T&gt; T maxn(T*, const int*); ...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

3
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
06.01.2010, 12:12
замени на
C++
1
/*1*/friend const Vector<T, N> & operator+<T,N>(const Vector<T, N> & v1, const Vector<T, N> & v2);
1
 Аватар для Aye Aye
373 / 287 / 97
Регистрация: 17.12.2009
Сообщений: 567
07.01.2010, 16:44
не выйдет перегрузить оператры << и >> в данном контексте для не скалярного обьекта типа Vector <T>, если только не заполнить буфер вывода значениями из v последовательно.
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
#include <conio.h>
#include <iostream>
using namespace std;
template <class T>class Vec
{
      public:
             T info[10];
             Vec()
             {
                  srand(time(0));
                  for (int i=0;i<10;i++)
                      info[i]=(T)rand()%10;    
             }
             template <T> friend ostream &operator << (ostream &out,const Vec<T> &v);
};
template <class T> ostream &operator<< (ostream &out,const Vec<T> &v)
{
       for (int i=0;i<10;i++) out << v.info[i] << " ";
       return out;
}
int main()
{
    Vec <int> v;
    cout << v << endl;
    getch();
}
1
9 / 9 / 3
Регистрация: 03.11.2009
Сообщений: 39
11.01.2010, 21:09  [ТС]
Вот как моя проблемка решилась.
надо было написать:
C++
1
template <T> friend std::istream & operator>> <>(std::istream & is, Vector<T, N> & v);
причем если писать
C++
1
template <T, N>
выдает ошибку: N is not a type

спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.01.2010, 21:09
Помогаю со студенческими работами здесь

C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend
выкидывает C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend при компиляции. что делать?

Шаблоны классов. Ошибка `unable to match function definition to an existing declaration`
#pragma once template &lt;typename T = int&gt; class SingleBuffer { public: SingleBuffer(T fd): field(fd), state(true){} ...

Friend declaration construction
Читаю C++ Templates. The Complete Guide. Вандервурд, Джоссатис В одной из глав речь идет об объявлениях дружественных конструкций. ...

Friend template class with template class argument
Помогите подружить 2 класса: Имеется класс Student: template &lt;class _T&gt; class Faculty; class Student{ friend...

Error: template declaration of (Code::Blocks)
Помогите побороть ошибки. Код:#include &lt;cstdlib&gt; #include &lt;string&gt; #include &lt;vector&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru