0

I am learning how to use template in c++ language ,my program is just simple linear search program which i use just for understanding purpose while compiling the program compiler constantly giving me this linker error

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;
    }
}

I have tried moving all the definitions from the helper.cpp to header under class but compiler still gives me error is there any thing i need to change in this code please guide me. Thanks in advance.

Petter Hesselberg
  • 5,062
  • 2
  • 24
  • 42

1 Answers1

0

You have to move the implementation of the functions which uses template out of .cpp and put it into header file(.h)

template functions and classes should be implemented in header file (.h).

Compiled in my machine - working fine. here is the code in header file

#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 */
miken32
  • 42,008
  • 16
  • 111
  • 154
Deb S
  • 509
  • 5
  • 16