zoukankan      html  css  js  c++  java
  • 使用vs2015编辑c++模板程序报错2019

      笔者这几天在熟悉vs2015工具编辑c++,(从前用的都是vc++6.0)。发现还真是不容易使用,简单的一个小程序会报错一大堆你看不懂的问题。现将我发现的重要的一个问题呈现给大家。

      在使用类模板设计对象时,通常会使用友元函数提供对该类的内部私有成员数据访问,请看下面这段代码,定义了一个顺序表的基本运算

     1 template <typename T>
     2 class SqListClass { //顺序表类模板
     3     T * data;  //存放顺序表中的元素
     4     int length; //存放顺序表的长度
     5 public:
     6     SqListClass();  //构造初始化,分配存储空间,初始化表长度为0
     7     ~SqListClass();  //析构函数,释放分配空间
     8     void CreateList(T a[], int n);  //用给定的数组元素创建顺序表
     9     void DispList();   // 输出顺序表所有元素
    10     int ListLength();  //获取顺序表长度
    11     bool GetElem(int i, T &e); //求顺序表中某序号的元素值
    12     int LocateElem(T e); //按元素值查找序号
    13     bool ListInsert(int i, T e); //插入数据元素
    14     bool ListDelete(int i); //删除数据元素
    15 
    16     //其他函数算法实现
    17     //template <typename T>
    18     friend void Reserve(SqListClass<T> & L); //将顺序表元素逆置 例L={1,2,3,4}变为L={4,3,2,1}
    19 //    template <typename T>
    20     friend bool DeleteElem(SqListClass<T> & L,T e); //删除指定元素值
    21 //    template <typename T>
    22     friend void Merge2(SqListClass<T> & L1, SqListClass<T> & L2, SqListClass<T> &L3); //二路归并算法
    23 };

      具体实现不列出来了,然后我在主函数中是这样调用的

     1 #include<iostream>
     2 #include "SqListClass.cpp"
     3 using namespace std;
     4 int main()
     5 {
     6     SqListClass<int> s1, s2;
     7     int a[4] = { 1,2,3,4 };
     8     s1.CreateList(a, 4);
     9     
    10     int b[3] = { 5,7,9 };
    11     s2.CreateList(b, 3);
    12     
    13     SqListClass<int> s3;
    14     Merge2(s1, s2, s3);
    15     s3.DispList();
    16 }

    在编译时会报错如下

    解决方法:在定义模板类和模板函数时候,必须加上template <typename T>这一行语句

    即:

    ①当定义模板类时,在类定义头文件(*.h)可以这样写

    template <typename T>

    class A{

    //类体

    };

    在类实现(*.cpp)里面,每一个成员函数都要这样写

    template <typename T>

    返回值 A<T>::函数名(形参列表){

    //函数体

    }

    ②在模板类中要定义友元函数不免也是要定义模板函数的

    此时需要注意,(*.h)头文件中模板友元函数的定义应该是

    template <typename T>

    friend 返回值 函数名(形参表);

    (*.cpp)文件中模板友元类实现如下:

    template <typename T>

    返回值 函数名(形参表)

    {

    //函数体

    }

    这样就不会报错2019了。问题解决

    同理,在设计模板友元类B时,不管是提前声明友元类B,还是在类A中定义友元模板类B,还是定义模板友元类B都不要忘记加上

    template <typename T>

    链接微软提供的报错2019 解决方法https://msdn.microsoft.com/query/dev14.query?appId=Dev14IDEF1&l=ZH-CN&k=k(LNK2019)&rd=true

  • 相关阅读:
    Windows网络编程:多线程技术
    Windows网络编程:OSI七层模型
    Windows网络编程:WinSock模型
    Windows网络编程:基于Scoket最简单的CS
    Windows网络编程:同步/异步 阻塞/非阻塞
    1.WebGL:简介
    无聊的面试啊:2020
    第一次面试
    实习第三周
    Eclipse新建web项目
  • 原文地址:https://www.cnblogs.com/gaochaochao/p/8387762.html
Copyright © 2011-2022 走看看