错误LNK2019:未解析的外部符号模板

时间:2016-12-21 06:42:12

标签: c++ templates

我正在学习如何在c ++语言中使用模板,我的程序只是简单的线性搜索程序,我只是为了理解目的而编译程序编译器不断给我这个链接器错误

Error   1   error LNK2019: unresolved external symbol "public: __thiscall searching<int>::searching<int>(int)" (??0?$searching@H@@QAE@H@Z) referenced in function _main C:\Users\Sachin\Documents\Visual Studio 2012\C++\template\template\Source.obj   template
Error   2   error LNK2019: unresolved external symbol "public: __thiscall searching<int>::~searching<int>(void)" (??1?$searching@H@@QAE@XZ) referenced in function _main    C:\Users\Sachin\Documents\Visual Studio 2012\C++\template\template\Source.obj   template
Error   3   error LNK2019: unresolved external symbol "public: void __thiscall searching<int>::set_data(void)" (?set_data@?$searching@H@@QAEXXZ) referenced in function _main   C:\Users\Sachin\Documents\Visual Studio 2012\C++\template\template\Source.obj   template
Error   4   error LNK2019: unresolved external symbol "public: void __thiscall searching<int>::get_data(void)" (?get_data@?$searching@H@@QAEXXZ) referenced in function _main   C:\Users\Sachin\Documents\Visual Studio 2012\C++\template\template\Source.obj   template

Header.h

#include<iostream>
using namespace std;
typedef int BOOL;
#define TRUE 1
#define FALSE 0

template <class t>
class searching
{
private :
    t *ptr;
    int isize;
    BOOL sort;

public:
    searching(int);
    searching(searching &);
    ~searching();

    BOOL linearsearch(t);
    BOOL linearsearchbi(t);
    BOOL binarysearch(t);
    void set_data();
    void get_data();
    BOOL chechsorted();

};

的main.cpp

#include "Header.h"

int main()
{

    searching <int>obj1(10);
    //searching <float>obj2;


    obj1.set_data();
    obj1.get_data();
    obj1.linearsearch(5);
    return 0;
}

helper.cpp

#include"Header.h"

template <class t>
searching <t>::searching(int ino)
{
    isize =ino;
    ptr= new <t> [isize];
}

template <class t>
searching <t> ::searching(searching  &ref)
{
    isize=ref.isize;
    ptr=new <t>[isize];

    for(int i=0;i<isize;i++)
    {
        ptr[i]=ref.ptr[i];
    }
}

template <class t>
searching <t>::~searching()
{
    delete []ptr;
}

template <class t>
void searching <t>::set_data()
{
    cout<<"Enter "<<isize<<" element"<<endl;
    for(int i=0;i<isize;i++)
    {
        cin>>ptr[i];
    }
}

template <class t>
void searching <t> ::get_data()
{
    cout<<"Eelements are :"<<endl;
    for(int i=0;i<isize;i++)
    {
        cout<<ptr[i]<<endl;
    }
}

template <class t>
BOOL searching <t>::linearsearch(t value)
{
    int i=0; 
    for(i=0;i<isize;i++)
    {
        if(ptr[i]==value)
        break;
    }
    if(i==isize)
    {
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}

我已经尝试将所有定义从helper.cpp移动到类下的标题但编译器仍然给我错误是否有任何我需要在此代码中更改的内容请指导我。 提前谢谢。

1 个答案:

答案 0 :(得分:-1)

你必须移动使用.cpp模板的函数的实现并将其放入头文件(.h)

模板函数和类应该在头文件(.h)中实现。

编辑:在我的机器中编译 - 工作正常。为什么投票失败? 这是头文件中的代码

#ifndef Header_h
#define Header_h

#include<iostream>
using namespace std;
typedef int BOOL;
#define TRUE 1
#define FALSE 0

template <class t>
class searching
{
    private :
    t *ptr;
    int isize;
    BOOL sort;

    public:
    searching(int into){
        isize =into;
        ptr= new t [isize];
    }
    searching(searching &ref)
    {
        isize=ref.isize;
        ptr=new t[isize];

        for(int i=0;i<isize;i++)
        {
            ptr[i]=ref.ptr[i];
        }
    }
    ~searching(){
        delete []ptr;
    }


    BOOL linearsearch(t value){
        int i=0;
        for(i=0;i<isize;i++)
        {
            if(ptr[i]==value)
            break;
        }
        if(i==isize)
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }


    void set_data(){
        cout<<"Enter "<<isize<<" element"<<endl;
        for(int i=0;i<isize;i++)
        {
            cin>>ptr[i];
        }
    }
    void get_data(){
        cout<<"Eelements are :"<<endl;
        for(int i=0;i<isize;i++)
        {
            cout<<ptr[i]<<endl;
        }
    }

};
#endif /* Header_h */