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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
06.01.2010, 04:53     Ошибка: friend declaration declares a non-template function #1
Всем доброго времени суток!
Я корплю над задачкой: нада сделать класс вектор шаблонным, перегрузить операции ввода-вывода, и тд и тп.
Вот с вводом-выводом у меня и проблемы.
Вернее со всеми шестью 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);
но на такую запись выдает не предупреждение а ошибку (хочет сразу за < поставить ; )

Подскажите, пожалуйста, как можно решить эту проблемку?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2010, 04:53     Ошибка: friend declaration declares a non-template function
Посмотрите здесь:

Friend Function C++
friend function C++
C++ Шаблоны классов. Ошибка `unable to match function definition to an existing declaration`
friend function C++
Friend function and Overload <<(>>) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
06.01.2010, 12:12     Ошибка: friend declaration declares a non-template function #2
замени на
C++
1
/*1*/friend const Vector<T, N> & operator+<T,N>(const Vector<T, N> & v1, const Vector<T, N> & v2);
Aye Aye
 Аватар для Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
07.01.2010, 16:44     Ошибка: friend declaration declares a non-template function #3
не выйдет перегрузить оператры << и >> в данном контексте для не скалярного обьекта типа 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();
}
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
11.01.2010, 21:09  [ТС]     Ошибка: friend declaration declares a non-template function #4
Вот как моя проблемка решилась.
надо было написать:
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

спасибо)
Yandex
Объявления
11.01.2010, 21:09     Ошибка: friend declaration declares a non-template function
Ответ Создать тему
Опции темы

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