Help for me:LNK2019

  • Thread starter Thread starter Ñ©ÔÆÓ¥
  • Start date Start date
Ñ

Ñ©ÔÆÓ¥

Hi,I have met a trouble,has anyone can help me?

error detail:
Linking...
ListTest.obj : error LNK2019: unresolved external symbol "public: __thiscall
com::LinearList<int>::LinearList<int>(int)" (??0?$LinearList@H@com@@QAE@H@Z)
referenced in function _main
D:\Project\CPPTest\Debug\CPPTest.exe : fatal error LNK1120: 1 unresolved
externals

<ListTest.cpp>
-------------------------------------------------------------------------------------------
#include <stdafx.h>
#include "List.h"
#include <iostream>

using namespace std;
using namespace com;

void main()
{
try
{
LinearList<int> L(10);
//cout << "Length = " << L.Length() << endl;
//cout << "IsEmpty = " << L.IsEmpty() <<endl;
////L.Insert( 0 , 2 ).Insert( 1 ,6 ) ;
////cout << "List is " << L << endl;
//cout << "IsEmpty = " << L.IsEmpty() << endl;
//int z = 0;
////L.Find( 1 , z ) ;
//cout << "First element is " << z << endl;
//cout << "Length = " << L.Length() << endl;
////L.Delete( 1 , z ) ;
//cout << "Deleted element is " << z << endl;
////cout << "List is " << L << endl;

}
catch (...)
{
cerr << "An exception has occurred" << endl;
}
}


<List.h>
-------------------------------------------------------------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;

namespace com {
// ÄÚ´æ²»×ã
class NoMem {
public:
NoMem () {}
};

template<class T> class LinearList {
public:
//¹¹Ô캯Êý
LinearList(int MaxListSize);
//Îö¹¹º¯Êý
~LinearList() {delete [] element;}
bool IsEmpty() const {return length == 0;}
int Length() const {return length;}
//·µ»ØµÚk¸öÔªËØÖÁxÖÐ
bool Find(int k, T& x) const;
// ·µ»ØxËùÔÚλÖÃ
int Search(const T& x) const;
// ɾ³ýµÚk¸öÔªËز¢½«Ëü·µ»ØÖÁxÖÐ
LinearList<T>& Delete(int k, T& x);
// ÔÚµÚk¸öÔªËØÖ®ºó²åÈëx
LinearList<T>& Insert(int k, const T& x);
void Output(ostream& out) const;
private:
int length;
int MaxSize;
// һά¶¯Ì¬Êý×é
T *element;
} ;

};

<List.cpp>
-----------------------------------------------------------------------------
#include <stdafx.h>
#include "List.h"
#include <iostream>
using namespace std;

namespace com {

// ʹn e wÒý·¢N o M e mÒì³£¶ø²»ÊÇx a l l o cÒì³£
void my_new_handler()
{
throw NoMem();
}

//set new handler for new operation
new_handler Old_Handler_=set_new_handler(my_new_handler);

template<class T> LinearList<T>::LinearList(int MaxListSize)
{
// »ùÓÚ¹«Ê½µÄÏßÐÔ±íµÄ¹¹Ô캯Êý
MaxSize = MaxListSize;
element = new T[MaxSize];
length = 0;
}
......
}
 
Ñ©ÔÆÓ¥ said:
Hi,I have met a trouble,has anyone can help me?

error detail:
Linking...
ListTest.obj : error LNK2019: unresolved external symbol "public:
__thiscall com::LinearList<int>::LinearList<int>(int)"
(??0?$LinearList@H@com@@QAE@H@Z) referenced in function _main
D:\Project\CPPTest\Debug\CPPTest.exe : fatal error LNK1120: 1 unresolved
externals

<ListTest.cpp>
-------------------------------------------------------------------------------------------
#include <stdafx.h>
#include "List.h"
#include <iostream>

using namespace std;
using namespace com;

void main()
{
try
{
LinearList<int> L(10);
//cout << "Length = " << L.Length() << endl;
//cout << "IsEmpty = " << L.IsEmpty() <<endl;
////L.Insert( 0 , 2 ).Insert( 1 ,6 ) ;
////cout << "List is " << L << endl;
//cout << "IsEmpty = " << L.IsEmpty() << endl;
//int z = 0;
////L.Find( 1 , z ) ;
//cout << "First element is " << z << endl;
//cout << "Length = " << L.Length() << endl;
////L.Delete( 1 , z ) ;
//cout << "Deleted element is " << z << endl;
////cout << "List is " << L << endl;

}
catch (...)
{
cerr << "An exception has occurred" << endl;
}
}


<List.h>
-------------------------------------------------------------------------------------------
template<class T> class LinearList {
public:
//¹¹Ô캯Êý
LinearList(int MaxListSize);
//Îö¹¹º¯Êý
~LinearList() {delete [] element;}

} ;

};

<List.cpp>
-----------------------------------------------------------------------------
#include <stdafx.h>
#include "List.h"
#include <iostream>
using namespace std;

namespace com {

// ʹn e wÒý·¢N o M e mÒì³£¶ø²»ÊÇx a l l o cÒì³£
void my_new_handler()
{
throw NoMem();
}

//set new handler for new operation
new_handler Old_Handler_=set_new_handler(my_new_handler);

template<class T> LinearList<T>::LinearList(int MaxListSize)
{
// »ùÓÚ¹«Ê½µÄÏßÐÔ±íµÄ¹¹Ô캯Êý
MaxSize = MaxListSize;
element = new T[MaxSize];
length = 0;
}

I am pretty sure it will work if you do not split declaration and
implementation into 2 separate files.
i.e. you have to put the full implementation in the header file.

if you want to split the declaration and implementation of a template class
you would have to use the export keyword.

quote from stroustroub, programming C++ language 3d edition, page 351:
"To be accessible from other compilation units, a template definition must
be explicitly declared export ...
otherwise, the definition must be in scope whenever the template is used"

sadly, the export keyword is not supported in VC, so you have to put the
implementation in your header file.

--

Kind regards,
Bruno.
(e-mail address removed)
Remove only "_nos_pam"
 
Ñ©ÔÆÓ¥ said:
Hi,I have met a trouble,has anyone can help me?

template<class T> class LinearList {
public:
//¹¹Ô캯Êý
LinearList(int MaxListSize);
...
} ;

Where's definition of this constructor?
 
Back
Top