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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
#1

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

06.01.2010, 04:53. Просмотров 2012. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2010, 04:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка: friend declaration declares a non-template function (C++):

Ошибка компиляции: template-id does not match any template declaration - C++
Здравствуйте. Помогите, пожалуйста: #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? - C++
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

C:\Dev-Cpp\lib\vector.h `ostream' is neither function nor member function; cannot be declared friend - C++
выкидывает 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` - C++
#pragma once template &lt;typename T = int&gt; class SingleBuffer { public: SingleBuffer(T fd): field(fd), state(true){} ...

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

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

3
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
06.01.2010, 12:12 #2
замени на
C++
1
/*1*/friend const Vector<T, N> & operator+<T,N>(const Vector<T, N> & v1, const Vector<T, N> & v2);
1
Aye Aye
369 / 283 / 36
Регистрация: 17.12.2009
Сообщений: 567
07.01.2010, 16:44 #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();
}
1
togramago
9 / 9 / 0
Регистрация: 03.11.2009
Сообщений: 39
11.01.2010, 21:09  [ТС] #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

спасибо)
0
11.01.2010, 21:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2010, 21:09
Привет! Вот еще темы с ответами:

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

Friend function - C++
Нужно сделать функции Length и Angle френдовыми для другого класса. Как это запилить? Sect.h #include &lt;iostream&gt; #include &lt;math.h&gt; ...

Friend Function - C++
Я не очень понимаю как пользаватса Friend функцыей Class.h #include &lt;stdio.h&gt; #include &quot;iostream&quot; using namespace std; ...

friend function - C++
После добавления дружественной ф-ции sum( а она для сложения salary у человека, которого я выберу) класс перестал работать. Что у меня не...


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

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

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