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

在定义一个模板类的时候,将类模板成员函数放在独立的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

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
远程桌面连接出现内部错误可能是由于多种原因引起的。以下是一些可能的解决方法: 1. 确保目标计算机已打开远程桌面功能并且已被授权访问。 2,用于读写文件。C++ 标准库中提供了多种文件输入输出的函数,如打开文件、关闭文件、读取文件、写入文件等。 2. 标准输入输出 标准输入输出是一种常见的输入输出方式,用于读写标准输入输出。C++ 标准库中提供了多种标准输入输出的函数,如读取字符、读取字符串、写入字符、写入字符串等。 七、C++ 标准库中的其他功能 C++ 标准库中还包含了许多其他功能,如时间日期、正则表达式、多线程等。这些功能的选择取决于应用程序的需求,不同的功能具有不同的性能特征和使用方式。 1. 时间日期 时间日期是一种常见的功能,用于处理时间和日期。C++ 标准库中提供了多种时间日期的函数,如获取当前时间、格式化输出时间、计算时间差等。 2. 正则表达式 正则表达式是一种常见的字符串匹配方式,用于匹配符合特定规则的字符串。C++ 标准库中提供了多种正则表达式的函数,如匹配、查找、替换等。 3. 多线程 多线程是一种常见的并发编程方式,用于提高程序的性能和响应速度。C++ 标准库中提供了多种多线程的函数,如创建线程、等待线程、线程同步等。 结论 C++ 标准库是 C++ 语言的重要组成部分,它提供了富的库函数和数据类型,以帮助程序员开发高效、可靠的应用程序。C++ 标准库中包含了多种容器、算法、迭代器、类模板函数模板、输入输出等,涵盖了各个方面的应用。程序员可以根据应用程序的需求选择不同的库函数和数据类型,以提高程序的性能和开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值