关于友元函数在模板类中使用出现的问题的解决办法及模板的机制

编程入门 行业动态 更新时间:2024-10-25 06:27:20

关于友元函数在<a href=https://www.elefans.com/category/jswz/34/1770549.html style=模板类中使用出现的问题的解决办法及模板的机制"/>

关于友元函数在模板类中使用出现的问题的解决办法及模板的机制

模板两大难点:

一、写在用一个文件,但不放在类中

1.友元函数写在类中

template <typename T>
class Complex
{
    friend ostream& operator << (ostream& out, Complex &c)
    {
        out << c.a << "+" << c.b << "i" << endl;
        return out;
    }

};

2.按照一般改写,如下:

template <typename T>
class Complex
{
    friend ostream& operator << (ostream& out, Complex &c);

};

template <typename T>
ostream& operator << (ostream& out, Complex<T> &c)
{
    out << c.a << "+" << c.b << "i" << endl;
    return out;
}

错误    1    error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Complex<int> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Complex@H@@@Z),该符号在函数 _main 中被引用    D:\C++study\eight\Complex\Complex\dm02.obj    Complex

3.解决办法:由友元函数类中改成成类外,但是在同一个文件中

template <typename T>
class Complex
{
    friend ostream& operator << <T>(ostream& out, Complex &c);

};

template <typename T>
ostream& operator << (ostream& out, Complex<T> &c)
{
    out << c.a << "+" << c.b << "i" << endl;
    return out;
}

只要在类中声明过程中添加<T>

4.原因:

模板的机制:模板会有二次编译,第一次编译检查类模板或函数模板是否有词法语法等错误,在使用模板函数,编译器会根据实际类型不同生成不同的函数,然后就能找到相应类型的函数体。在实际运用中,模板函数可以利用编译器自动推断类型,可以显式或隐式使用函数模板,类模板必须显式使用,告诉编译器模板类的类型。

原因:第一次编译的函数头和第二次编译的函数头不同,
      friend ostream& operator << (ostream& out, Complex &c);
      ostream& operator << (ostream& out, Complex<T> &c)

导致找不到函数体,出现错误。

二、写在不同的文件中(.cpp和.h)

main.cpp引用时,#include"complex.cpp" 而不是#include"complex.h"

实例:

complex.h

#pragma once
#include <iostream>
using namespace std;
template <typename T>
class Complex
{
    friend ostream& operator << <T>(ostream& out, Complex &c);
    /*
    friend Complex Sub(Complex &c1, Complex &c2)
    {
    Complex tmp(c1.a - c2.a, c1.b - c2.b);
    return tmp;
    }
    */
private:
    T a;
    T b;
public:
    Complex(T a, T b);
    void print();
    Complex operator + (Complex &c2);
    Complex operator - (Complex &c2);
};

complex.cpp

#include "complex.h"
template <typename T>
Complex<T>::Complex(T a, T b)
{
    this->a = a;
    this->b = b;
}

template <typename T>
void Complex<T>::print()
{
    cout << a << "+" << b << "i" << endl;
}

template <typename T>
Complex<T> Complex<T>::operator - (Complex<T> &c2)
{
    Complex tmp(a - c2.a, b - c2.b);
    return tmp;
}

template <typename T>
ostream& operator << (ostream& out, Complex<T> &c)
{
    out << c.a << "+" << c.b << "i" << endl;
    return out;
}

template<typename T>
Complex<T> Complex<T>::operator + (Complex<T> &c2)
{
    Complex<T> c1(0, 0);
    c1.a = this->a + c2.a;
    c1.b = this->b + c2.b;
    return c1;
}
main.cpp

#include <iostream>
using namespace std;
#include "complex.cpp"

int main()
{
    Complex<int> c1(1, 2);
    Complex<int> c2(3, 4);
    Complex<int> c3(5, 6);
    Complex<int> c4 = c1 + c2 + c3;
    cout << c4 << endl;

    //滥用友元
   // Complex<int> c5 = Sub(c1, c2);
   // cout << c5 << endl;  //这种是无法解决的
    Complex<int> c6 = c1 - c2;
    cout << c6 << endl;

    system("pause");
}

更多推荐

关于友元函数在模板类中使用出现的问题的解决办法及模板的机制

本文发布于:2024-03-05 14:27:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1712541.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模板   解决办法   函数   类中   机制

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!