CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
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!

Posting Permissions

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





Click Here to Expand Forum to Full Width

Featured