使用C++类模板,出现链接错误

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dfq12345/article/details/78212002

在定义一个模板类的时候,将类模板成员函数放在独立的cpp实现文件中,将模板类声明放在一个h文件中。在一个文件中需要使用到这个类,直接include头文件发现出现链接错误。

由于模板不是函数,只是一些C++编译器指令,说明了如何生成类和成员函数定义,无法单独编译成obj文件,因此不能将模板成员函数放在独立的实现文件中。模板必须与特定的模板实例化请求一起使用,最简单的方法是将所有的模板信息放在一个头文件中,并在要使用这些模板的文件中包含该头文件。

错误示例代码:

/*matrix.h*/
#ifndef _MATRIX_
#define _MATRIX_

#include <iostream>
#include <vector>
#include <assert.h>

template<typename T>
class Matrix {
  int row, col;
  std::vector<std::vector<T> > mem;

public:
  Matrix();
  ~Matrix();
  Matrix(T **arr, int n, int m);
  void display();

};

#endif
/*matrix.cpp*/
#include "matrix.h"

template<typename T>
Matrix<T>::Matrix()
{
}

template<typename T>
Matrix<T>::~Matrix()
{
}

template<typename T>
Matrix<T>::Matrix(T **arr, int n, int m)
{
  using std::vector;
  assert(n >= 0 && m >= 0 && arr);
  mem = vector<vector<T> >(n, vector<T>(m));
  for (int i = 0; i < n; ++i) 
    for (int j = 0; j < m; ++j) 
      mem[i][j] = arr[i][j];
  this->row = n;
  this->col = m;
}

template<typename T>
void Matrix<T>::display()
{
  for (auto &v: mem) {
    for (auto &e: v)
      std::cout << e << " ";
    std::cout << "\n";
  }
}
#include <iostream>
#include <vector>
#include <stdlib.h>
#include "matrix.h"

int * newIntRaw(int n)
{
  return (int *)malloc(sizeof(int) * n); 
}

int ** newMap(int n, int m)
{
  int **pMap = (int **)malloc(sizeof(int *) * n);
  for (int i = 0; i < n; ++i)
    pMap[i] = (int *)malloc(sizeof(int) * m);
  return pMap;
}


int main()
{
  int row, col;
  std::cin >> row >> col;
  int **pMap = newMap(row, col);
  // cut
  Matrix<int> matrix(pMap, row, col); //链接错误,找不到函数实现
  matrix.display();
  // free map
  return 0;
}
main: main.o matrix.o
    g++ -std=c++11 main.o matrix.o -o main
main.o: main.cpp
    g++ -std=c++11 -c main.cpp -o main.o
matrix.o: matrix.cpp
    g++ -std=c++11 -c matrix.cpp -o matrix.o

clean:
    rm *.o main
run:
    ./main

hui@hui-Lenovo-V1000:~/project/cpp$ make
g++ -std=c++11 -c main.cpp -o main.o
g++ -std=c++11 -c matrix.cpp -o matrix.o
g++ -std=c++11 main.o matrix.o -o main
main.o:在函数‘main’中:
main.cpp:(.text+0xe0):对‘Matrix::Matrix(int**, int, int)’未定义的引用
main.cpp:(.text+0xef):对‘Matrix::display()’未定义的引用
main.cpp:(.text+0x103):对‘Matrix::~Matrix()’未定义的引用
main.cpp:(.text+0x124):对‘Matrix::~Matrix()’未定义的引用
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target ‘main’ failed
make: * [main] Error 1

展开阅读全文

C++ 类模板 链接错误

04-09

我写的类模板编译没有问题,在使用的时候出现了链接错误!刚接触类模板,还望高手赐教!rn现将代码贴出来大家帮忙看看!rnrnlinearList.hrn///////////////////////////////////////////////////////////////////////////////////////rn#pragma oncernrntemplate class List;rnrntemplate rnrnstruct LinkNode // 链表结点类的定义rnrn item data; // 数据域rn LinkNode *link; // 链指针域rnrn // 仅初始化指针成员的构造函数rn LinkNode(LinkNode *ptr=NULL)rn rn link=ptr;rn rnrn // 初始化数据与指针成员的构造函数rn LinkNode(item const& itemData, LinkNode* ptr=NULL)rn rn data=itemData;rn link=ptr;rn rn;rnrntemplate rnrnclass Listrnrnprotected:rn LinkNode *first; // 链表的头指针rnrnpublic:rn List(void)rn rn first=new LinkNode;rn ;rn List(item const& x)rn rn first=new LinkNode(x);rn ;rn List(List& L);rnrn ~List(void)rn rn makeEmpty();rn ;rnrn void makeEmpty(void) const;rn int Lenght(void)const;rn LinkNode* getHead(void)constrn rn return first;rn ;rn LinkNode* search(item x);rn LinkNode* locate(int i);rn bool getData(int i,item& x)const;rn void setData(int i,item& x);rn bool insert(int i,item& x);rn bool remove(int i,item& x);rn bool isEmpty(void)constrn rn return first->link==NULL?true:false;rn ;rn bool isFull()constrn rn return false;rn ;rn /*void sort(void);rn void input();*/rn void output();rn List& operator=(List& L);rn;rn///////////////////////////////////////////////////////////////////////////////////////rnlinearList.cpprn--------------------------------------------------------------------------------------rn#include "StdAfx.h"rn#include ".\linearlist.h"rnrntemplaternList::List(List& L) // 拷贝构造函数rnrn item value;rn LinkNode* srcptr=L.getHead(); // 拷贝附加头结点rn first=new LinkNode;rn LinkNode* destptr=first;rn while(NULL!=srcptr->link!) // 拷贝各个结点rn rn value=srcptr->link->data;rn destptr->link=new LinkNode(value);rn destptr=destptr->link;rn srcptr=srcptr->link;rn rn destptr->link=NULL;rnrnrnrntemplate rnList& List::operator=(List& L)rnrn item value;rn LinkNode* srcptr=L.getHead();rn first=new LinkNode;rn LinkNode* destptr=first;rn while(NULL!=srcptr->link)rn rn value=srcptr->link->data;rn destptr->link=new LinkNode(value);rn destptr=destptr->link;rn srcptr=srcptr->link;rn rn destptr->link=NULL; // 放回操作对象地址rn return *this;rnrnrntemplate rnvoid List::output()rnrn LinkNode *current=first->link;rn while(NULL!=current)rn rn cout<data<link;rn rnrnrn//template rn//void List::input()rn//rn// rn//rn//rn//template rn//void List::sort(void)rn//rn// rn//rnrntemplate rnbool List::remove(int i,item& x)rnrn LinkNode *current=locate(i-1);rn if(NULL==current||NULL==current->link)rn return false;rnrn LinkNode *del=current->link;rn current->link=del->link;rn x=del->data;rn delete del;rnrn return true;rnrnrntemplate rnbool List::insert(int i,item& x)rnrn LinkNode* current=locate(i);rn if(NULL==current)rn return false;rnrn LinkNode* newNode=new LinkNode(x);rn if(NULL==newNode)rn rn cerr<<"存储分配错误!"<link=current->link;rn current->link=newNode;rnrn return true;rnrnrntemplate rnvoid List::setData(int i,item& x)rnrn if(i<=0)rn return;rn LinkNode *current=locate(i);rn if(NULL==current)rn return;rn elsern current->data=x;rnrnrntemplate rnbool List::getData(int i,item& x)constrnrn if(i<=0)rn return false;rnrn LinkNode* current=locate(i);rn if(NULL==current)rn return false;rn elsern return x=current->data;rnrn return true;rnrnrntemplate rnLinkNode* List::locate(int i)rnrn if(i<0)rn return NULL;rnrn LinkNode* current=first;rn int k=0;rn while(NULL!=current->link&&klink;rn k++;rn rnrn return current;rnrnrntemplate rnLinkNode* List::search(item x)rnrn LinkNode* current=first->link;rn while(NULL!=current)rn rn if(x==current->data)rn break;rn elsern current=current->link;rn rn rn return current;rnrnrntemplate rnint List::Lenght(void)constrnrn LinkNode* p=first->link;rn int count=0;rn while(NULL!=p)rn rn p=p->link;rn count++;rn rn return count;rnrnrntemplate rnvoid List::makeEmpty(void)constrnrn LinkNode *q;rn while(NULL!=first->link)rn rn q=first->link;rn first->link=q->link;rn delete q;rn rnrn///////////////////////////////////////////////////////////////////////////////////////rn包含 main 函数的文件rn---------------------------------------------------------------------------------------rn#include "stdafx.h"rn#include "linearList.h"rn#include rnrnusing namespace std;rnrnint _tmain(int argc, _TCHAR* argv[])rnrn List* pList=new List;rn for(int i=0;i<10;i++)rn rn int j=i;rn pList->insert(j,i);rn rn return 0;rnrn///////////////////////////////////////////////////////////////////////////////////////rn编译出错信息rn--------------------------------------------------------------------------------------rnerror LNK2019: 无法解析的外部符号 "public: bool __thiscall List::insert(int,int &)" (?insert@?$List@H@@QAE_NHAAH@Z) ,该符号在函数 _main 中被引用rnDebug/list.exe : fatal error LNK1120: 1 个无法解析的外部命令rn///////////////////////////////////////////////////////////////////////////////////////rnrnrn 论坛

没有更多推荐了,返回首页