CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
+ Reply to Thread
Results 1 to 5 of 5
  1. #1
    Join Date
    Nov 2008
    Location
    North America
    Posts
    37

    Templates and Unresolved Externals

    I'm not sure why I am getting unresolved externals. These are the errors I get:

    1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Array<int,10>::~Array<int,10>(void)" (??1?$Array@H$09@@QAE@XZ) referenced in function _main
    1>main.obj : error LNK2019: unresolved external symbol "public: int __thiscall Array<int,10>::getSize(void)const " (?getSize@?$Array@H$09@@QBEHXZ) referenced in function _main
    1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Array<int,10>::Array<int,10>(void)" (??0?$Array@H$09@@QAE@XZ) referenced in function _main
    1>F:\Users\yohosuff\Desktop\C++ HTPE10\Debug\C++ HTPE10.exe : fatal error LNK1120: 3 unresolved externals

    Here's the code:


    Code:
    #ifndef ARRAY_H
    #define ARRAY_H
    #include <iostream>
    using std::ostream;
    using std::istream;
    
    template<typename T, int numberOfElements>
    class Array
    {
    	friend ostream &operator<<( ostream &, const Array<T,numberOfElements> & );
    	friend istream &operator>>( istream &, Array<T,numberOfElements> & );      
    public:
    	Array();
    	~Array();          
    	int getSize() const;
    	const Array &operator=( const Array & );
    	bool operator==( const Array & ) const;
    
    	bool operator!=( const Array &right ) const                 
    	{                                                           
    		return ! ( *this == right );
    	}                              
    	
    	T &operator[]( int );                                              
    	
    	T operator[]( int ) const;                          
    private:
    	int size; 
    	T *ptr;
    };
    #endif
    Code:
    #include <iostream>
    using std::cerr;
    using std::cout;
    using std::cin;
    using std::endl;
    #include <iomanip>
    using std::setw;
    #include <cstdlib>
    using std::exit;
    
    #include "Array.h" // Array class definition
    
    
    template<typename T, int numberOfElements>
    Array<T,numberOfElements>::Array()
    {
    	size = ( numberOfElements > 0 ? numberOfElements : 10 );
    	ptr = new T[ size ];
    	for ( int i = 0; i < size; i++ )
    		ptr[ i ] = 0; 
    }
    
    
    template<typename T, int numberOfElements>
    Array<T,numberOfElements>::~Array()
    {
    	delete [] ptr;
    } 
    
    template<typename T, int numberOfElements>
    int Array<T,numberOfElements>::getSize() const
    {
    	return size;
    }
    
    template<typename T, int numberOfElements>
    const Array<T,numberOfElements> &Array<T,numberOfElements>::operator=( const Array<T,numberOfElements> &right )
    {
    	if ( &right != this ) 
    	{
    		
    		if ( size != right.size )
    		{
    			delete [] ptr;
    			size = right.size; 
    			ptr = new T[ size ]; 
    		} 
    		for ( int i = 0; i < size; i++ )
    			ptr[ i ] = right.ptr[ i ];
    	}
    	return *this;
    } 
    
    template<typename T, int numberOfElements>
    bool Array<T, numberOfElements>::operator==( const Array<T,numberOfElements> &right ) const
    {
    	if ( size != right.size )
    		return false; 
    	for ( int i = 0; i < size; i++ )
    		if ( ptr[ i ] != right.ptr[ i ] )
    			return false;
    	return true;
    }
    
    template<typename T, int numberOfElements>
    T &Array<T, numberOfElements>::operator[]( int subscript )
    {
    	if ( subscript < 0 || subscript >= size )
    	{
    		cerr << "\nError: Subscript " << subscript
    			<< " out of range" << endl;
    		exit( 1 ); 
    	} 
    	return ptr[ subscript ];
    }
    
    
    template<typename T, int numberOfElements>
    T Array<T,numberOfElements>::operator[]( int subscript ) const
    {
    
    	if ( subscript < 0 || subscript >= size )
    	{
    		cerr << "\nError: Subscript " << subscript
    			<< " out of range" << endl;
    		exit( 1 );
    	}
    
    	return ptr[ subscript ]; 
    }
    
    
    template<typename T, int numberOfElements>
    istream &operator>>( istream &input, Array<T,numberOfElements> &a )
    {
    	for ( int i = 0; i < a.size; i++ )
    		input >> a.ptr[ i ];
    
    	return input; 
    } 
    
    
    template<typename T, int numberOfElements>
    ostream &operator<<( ostream &output, const Array<T,numberOfElements> &a )
    {
    	int i;
    
    	for ( i = 0; i < a.size; i++ )
    	{
    		output << setw( 12 ) << a.ptr[ i ];
    
    		if ( ( i + 1 ) % 4 == 0 ) 
    			output << endl;
    	}
    
    	if ( i % 4 != 0 ) 
    		output << endl;
    
    	return output;
    }
    Code:
    #include <iostream>
    #include <string>
    #include <iomanip>
    #include <cmath>
    #include <ctime>
    #include <vector>
    
    using namespace std;
    
    #include "Array.h"
    
    int main()
    {
    
    	//14.7
    	Array<int,10> a;
    	a.getSize();
    
    	//********************
    	cout << "\nProgram Execution Complete\n";
    	system("PAUSE");
    	return 0;
    }
    Any help would be appreciated!

  2. #2
    Join Date
    Oct 2002
    Location
    Austria
    Posts
    1,284

    Re: Templates and Unresolved Externals

    You have to move the code from your template implementatation file into the header or #include it from the header.
    Reason: at the point of instantiation of a template the compiler has to be able to see the implementation.
    Search the forum for a better explaination. This problem comes up rather frequently.
    Kurt

  3. #3
    Join Date
    Jan 2008
    Location
    California, USA
    Posts
    822

    Re: Templates and Unresolved Externals

    and here's the link to Zuk's explaination.
    Why do I get linker errors when I use template friends?

  4. #4
    Join Date
    Nov 2008
    Location
    North America
    Posts
    37

    Re: Templates and Unresolved Externals

    Thanks for the tips, I'll give it a shot.

  5. #5
    Join Date
    Nov 2008
    Location
    North America
    Posts
    37

    Re: Templates and Unresolved Externals

    Awesome! Placing the implementation of the class in the header file worked! And, potatoCode, that link you provided was very helpful. Very helpful indeed. Kudos!

+ Reply to Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts



HTML5 Development Center

Click Here to Expand Forum to Full Width