2016-01-09 2 views
1

Я добавляю шаблоны C++ к существующей программе перегрузки операторов, и теперь я получаю эти ошибки. Я не могу исправить эти ошибки, может кто-нибудь мне помочь ... Вот код ... Я могу создать шаблон на простой перегруженной функции, но проблема с функцией друга. ***** ************ ПРИМЕЧАНИЕ: (Обновлено) кода после выпрямления ... /ПРОГРАММЫ ПОКАЗАТЬ перегрузку операторов/ #includeC++ шаблоны с функцией друга и перегрузкой оператора

template <class T> 
class OP 
{ 
    T x, y, z; 

    public: 

    void IN() 
    { 
     std::cout << "Enter three No's : "; 
     std::cin >> x >> y >> z; 
    } 

    void OUT() 
    { 
     std::cout << std::endl << x << " " << y << " " << z; 
    } 
    void operator~(); 
    void operator+(int);     //Can accept both one or two argument 

    template<class TA> 
    friend void operator++(OP<T>);    //Accept one arguments (Unary Operator); 

    template<class TB> 
    friend void operator-(OP<T>, int);  //Accept two arguments  (Binary Operator) 

    template<class TC> 
    friend void operator!=(OP&, char t); 
}; 

template<class T> 
void OP<T>::operator~() //Unary Member Operator 
{ 
    std::cout << std::endl << " ~ (tilde)"; 
} 

template<class T> 
void OP<T>::operator+(int y) //Binary Member Operator 
{ 
    std::cout << std::endl << "Argument sent is " << y; 
} 

template<class T> 
void operator-(OP<T> &a, int t) //Binary Friend Operator 
{ 
    a.x= a.x-t; 
    a.y= a.y-t; 
    a.z= a.z-t; 
} 

template<class T> 
void operator!=(OP<T> &q, char t) //Binary Friend Operator 
{ 
    std::cout << std::endl << "Char " << t; 
} 

template<class T> 
void operator++(OP<T> x) //Unary Friend Operator 
{ 
    std::cout << std::endl << "Friend Unary Operator"; 
} 

int main() 
{ 
    OP <int> n, m; 
    n.IN(); 
    m.IN(); 
    m+1; 
    n!='t'; 
    int a = 1; 
    char r='r'; 
    ~n;   //Member Function (Unary) 
    n-a;  //Member Function (Unary) 
    operator-(m, a); //Friend Function (Binary) 
    operator++(m); //Friend Function (Unary) 
    n.OUT(); 
    m.OUT(); 
    std::cin.get(); 
    return 0; 
} 

ошибка на все три друга и ошибка

Теперь мой друг функция не в состоянии получить доступ к закрытому члену ... < < < Пожалуйста, скажите мне, что я делаю неправильно ...

ответ

3

Если вы объявляете друга в шаблоне , вы должны либо предоставить определение в определении класса шаблона, либо переопределить его вне класса шаблона.

Объявление этой подругой в классе шаблонов не объявляет эту функцию в охватывающей области.

+0

Спасибо, используя первое решение, решил проблему, но можете ли вы рассказать мне, как ее переопределить вне класса. –

+0

Объявите функцию перед объявлением шаблона с помощью инструкции friend в нем - так же, как определение функции, но без тела , Конечно, вам нужно будет переслать объявление класса шаблона, прежде чем объявлять функцию, которая использует класс в качестве аргумента. –

Смежные вопросы