类模板无法解析的外部符号

Posted zwj-199306231519

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类模板无法解析的外部符号相关的知识,希望对你有一定的参考价值。

如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现“error LNK2019: 无法解析的外部符号 ”的错误。

 实例:

 MyClass.h:

#ifndef _CLASS_TEMPLATE_H_
#define _CLASS_TEMPLATE_H_

template<typename T1, typename T2>
class MyClass
{
public:
    MyClass(T1 tOne, T2 tTwo);//Constructor
    void Show();

private:
    T1 mOne;
    T2 mTwo;
};
#endif

MyClass.cpp:

#include "MyClass.h"
#include <iostream>
using namespace std;

template <typename T1, typename T2>
MyClass<T1, T2>::MyClass(T1 tOne, T2 tTwo)
{
  mOne = tOne;
   mTwo = tTwo;
} template
<typename T1, typename T2> void MyClass<T1, T2>::Show() { cout << "mOne=" << mOne << ", mTwo=" << mTwo << endl; }

Main.cpp

#include<iostream>
#include "MyClass.h"
using namespace std;

int main()
{
    MyClass<int, int> class1(3, 5);
    class1.Show();

    system("pause");
    return 0;
}

这样写会报错:

技术图片

 解决办法:将函数实现和函数声明合并在一起,即将MyClass.cpp和MyClass.h相合并,即直接写为MyClass.h,去掉MyClass.cpp文件,如下

MyClass.h

#ifndef _CLASS_TEMPLATE_H_
#define _CLASS_TEMPLATE_H_

template<typename T1, typename T2>
class MyClass
{
public:
    MyClass(T1 tOne, T2 tTwo)
    {
        mOne = tOne;
        mTwo = tTwo;
    }
    void Show()
    {
        cout << "mOne=" << mOne << ", mTwo=" << mTwo << endl;
    }

private:
    T1 mOne;
    T2 mTwo;
};
#endif

Main.cpp:

#include<iostream>
#include "MyClass.h"
using namespace std;

int main()
{
    MyClass<int, int> class1(3, 5);
    class1.Show();

    system("pause");
    return 0;
}

 

以上是关于类模板无法解析的外部符号的主要内容,如果未能解决你的问题,请参考以下文章

模板类 error LNK2019: 无法解析的外部符号

为啥在使用模板时会出现“未解析的外部符号”错误? [复制]

指向该类的类指针成员:未解析的外部符号

error LNK2019: 无法解析的外部符号

错误 LNK2019:使用类编译程序时出现无法解析的外部符号错误消息

error LNK2019: 无法解析的外部符号