Weird Linker Error 
  Aug 9, 2015 at 3:17pm UTC  
 
I was going back through Principles and Programming by Stroustrup and after completing the chapter 6 exercise I was left with these weird linker errors with  very unhelpful messages (to me). Does anyone know what's wrong here?
/* error LNK2019: unresolved external symbol "public: __thiscall Token_stream::Token_stream(void)" (??0Token_stream@@QAE@XZ) referenced in function "void __cdecl `dynamic initializer for 'ts''(void)" (??__Ets@@YAXXZ) */
/* error LNK1120: 1 unresolved externals */
Source code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 
#include "std_lib_facilities.h"; 
class  Token
{
public :
	char  kind;
	double  value;
};
class  Token_stream
{
public :
	Token_stream();
	void  putback(Token t);
	Token get();
private :
	bool  full{ false  };
	Token buffer;
};
void  Token_stream::putback(Token t)
{
	if  (full) error("putback() into full buffer." );
	buffer = t;
	full = true ;
}
Token Token_stream::get()
{
	if  (full)
	{
		full = false ;
		return  buffer;
	}
	char  ch;
	cin >> ch;
	switch  (ch)
	{
	case  ';' :
	case  'q' :
	case  '(' : case  ')' : case  '+' : case  '-' : case  '*' : case  '/' :
		return  Token{ ch };
	case  '.' :
	case  '0' : case  '1' : case  '2' : case  '3' : case  '4' :
	case  '5' : case  '6' : case  '7' : case  '8' : case  '9' :
	{
		cin.putback(ch);
		double  val;
		cin >> val;
		return  Token{ '8' , val };
	}
	default : error("Bad token" );
	}
}
Token_stream ts;
double  expression();
double  primary()
{
	Token t = ts.get();
	switch (t.kind)
	{
	case  '(' :
	{
		double  d = expression();
		t = ts.get();
		if  (t.kind != ')' )error("')' expected" );
		return  d;
	}
	default : error("primary expected" );
	}
}
double  term()
{
	double  left = primary();
	Token t = ts.get();
	while  (true )
	{
		switch  (t.kind)
		{
		case  '*' : left *= primary();
			t = ts.get();
			break ;
		case  '/' :
		{
			double  d = primary();
			if  (d == 0) error("divide by zero" );
			left /= d;
			t = ts.get();
			break ;
		}
		default :
			ts.putback(t);
			return  left;
		}
	}
}
double  expression()
{
	double  left = term();
	Token t = ts.get();
	while  (true )
	{
		switch  (t.kind)
		{
		case  '+' : left += term();
			t = ts.get();
			break ;
		case  '-' : left -= term();
			t = ts.get();
			break ;
		default :
			ts.putback(t);
			return  left;
		}
	}
}
int  main()
{
	try 
	{
		double  val{ 0 };
		while  (cin)
		{
			Token t = ts.get();
			if  (t.kind == 'q' ) break ;
			if  (t.kind == ';' ) cout << "="  << val << endl;
			else  ts.putback(t);
			val = expression();
		}
	}
	catch  (exception& e)
	{
		cerr << e.what() << endl;
		keep_window_open();
		return  1;
	}
	catch  (...)
	{
		cerr << "exception"  << endl;
		keep_window_open();
		return  2;
	}
}
 
 
Last edited on Aug 9, 2015 at 3:18pm UTC  
 
 
 
 
  Aug 9, 2015 at 3:33pm UTC  
 
The error message is saying that you never defined the body for the Token_stream class' constructor. It looks like you don't really need a constructor for the class any way so you could just use a default constructor.
1 2 3 4 5 6 
class  Token_stream
{
public :
	Token_stream(); // try removing or commenting out this line and see if that fixes things 
	void  putback(Token t);
	Token get();
 
 
 
 
 
 
  Aug 9, 2015 at 4:01pm UTC  
 
You're awesome it worked perfectly! Thank you so much. I can't believe I didnt consider that before.
 
 
 
Topic archived. No new replies allowed.