c ++中的模板成员函数

时间:2011-09-12 16:18:00

标签: c++ templates

我在c ++中遇到泛型问题。我有两个Matrix.h和Matrix.cpp文件。这是文件:

#pragma once
template<class T>
class Matrix
{
    public:
        static T** addSub(int size,T** firstMatrix,T** secondMatrix,int operation);
}

和Matrix.cpp

#include "Martix.h"
template<class T>
static T** Matrix<T>::addSub( int n,T **firstMatrix,T **secondMatrix,int operation)
{
    //variable for saving result operation
    T **result = new T*[n];

    //create result matrix
    for( int i=0;i<n;i++)
        result[i] = new T[n];

    //calculate result
    for( int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            result[i][j] = 
            (operation == 1) ? firstMatrix[i][j] + secondMatrix[i][j]:
                                firstMatrix[i][j] - secondMatrix[i][j];

    return result;
}

当我运行这些时,我得到以下错误:

Error   1   error LNK2019: unresolved external symbol "public: static int * * __cdecl Matrix<int>::addSub(int,int * *,int * *,int)" (?addSub@?$Matrix@H@@SAPAPAHHPAPAH0H@Z) referenced in function "public: static int * * __cdecl Matrix<int>::strassenMultiply(int,int * *,int * *)" (?strassenMultiply@?$Matrix@H@@SAPAPAHHPAPAH0@Z) C:\Users\ba.mehrabi\Desktop\Matrix\matrixMultiplication\main.obj    matrixMultiplication

问题是什么?

3 个答案:

答案 0 :(得分:5)

不幸的是,你不能在* .cpp文件中声明模板类。完整定义必须保留在头文件中。这是许多C ++编译器的规则。

请参阅:http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12

  
      
  1. 模板不是类或函数。模板是一种“模式”   编译器用来生成一系列类或函数。
  2.   
  3. 为了让编译器生成代码,它必须同时看到两者   模板定义(不仅仅是声明)和具体的   类型/用于“填写”模板的任何内容。例如,如果你是   试图使用Foo,编译器必须同时看到Foo模板   而且你正试图制作一个特定的Foo。
  4.   
  5. 您的编译器可能不记得一个.cpp的详细信息   文件正在编译另一个.cpp文件。它可以,但大多数都可以   不是,如果你正在阅读这个FAQ,它几乎肯定没有。   BTW这被称为“单独的编译模型。”
  6.   

该链接有一个解决方法,但请记住,模板是一个美化的宏,因此头文件可能是它的最佳位置。

this SO帖子的海报展示了解决方法的演示。

答案 1 :(得分:1)

首先,类模板的函数定义应该放在标题本身中。

其次,如果您在类外定义static成员函数(尽管在标题本身中),则不要使用static关键字(在定义中)。它只需要在声明中使用。

答案 2 :(得分:0)

添加

template Matrix<int>;

在你的cpp文件的末尾,它将工作。但是你需要学习一些关于模板的东西,否则你将不得不处理很多你不理解的问题。