Hopefully someone can figure out what's going on... I sure can't...
in main.cpp:
in OpCode.h:
in OpCode.cpp
Note that all the other functions in OpCode are defined inline.
in symtab.h (where I suspect I'm missing something):
and in symtab.cpp
It compiles fine, but the linker is choking somewhere. Specifically, I get
in main.cpp:
Code:
#include <iostream>
#include <fstream>
#include <string>
#include "symtab.h"
#include "OpCode.h"
using namespace std;
int main(int argc, char **argv)
{
...
}
in OpCode.h:
Code:
#ifndef OPCODE_H
#define OPCODE_H
#include <string>
using namespace std;
class OpCode
{
public:
OpCode(string mnem);
OpCode(string mnem, char hex, int bytes, string otherInfo);
string getMnem() { return iMnem;}
char getHex() {return iHex;}
int getBytes() {return length;}
string getOtherInfo() {return info;}
private:
string iMnem;
char iHex;
int length;
string info;
};
#endif
in OpCode.cpp
Code:
OpCode::OpCode(string mnem){iMnem = mnem;}
OpCode::OpCode(string mnem, char hex, int bytes, string otherInfo)
{
iMnem = mnem;
iHex = hex;
length = bytes;
info = otherInfo;
}
in symtab.h (where I suspect I'm missing something):
Code:
#ifndef SYMTAB_H
#define SYMTAB_H
#include <string>
using namespace std;
template <class AT>
class Item {
public:
Item(string s);
string getname(); // returns the name
AT attr; // attributes other than name
private:
string name;
};
template <class AT>
struct Node{
Item<AT> * info;
Node<AT> * link;};
template <class AT>
class SymTab {
public:
SymTab(); //initializes to the empty table
Item<AT> * find(string s); //returns Item pointer or null
Item<AT> * insert(string s); //inserts if necessary and
//returns Item pointer
~SymTab(); //This seems almost more necessary than the constructor
private:
Node<AT> hashTab[137];
int hash(string s);
Node<AT> * cons(Item<AT> * x, Node<AT> * y); //returns a new list node
// with x in the info field and y in the link field
};
#endif
and in symtab.cpp
Code:
#include "symtab.h"
template <class AT>
Item<AT>::Item(string s)
{
name = s;
}
template <class AT>
string Item<AT>::getname() { return name;} // returns the name
template <class AT>
SymTab<AT>::SymTab()
{
}
template <class AT>
Item<AT> * SymTab<AT>::find(string s)
{
...
}
template <class AT>
Item<AT> * SymTab<AT>::insert(string s)
{
...
}
template <class AT>
int SymTab<AT>::hash(string s)
{
...
}
template <class AT>
Node<AT> * SymTab<AT>::cons(Item<AT> *x, Node<AT> * y)
{
Node<AT> * ret = new Node<AT>;
ret->info = x;
ret->link = y;
return ret;
}
template <class AT>
SymTab<AT>::~SymTab()
{
...
}
It compiles fine, but the linker is choking somewhere. Specifically, I get
Everything's defined (although the SymTab constructor doesn't do anything since the only actual data is a fixed array), everything's properly included as far as I can tell... this is driving me nuts. Someone tell me I'm misspelling something somewhere./usr/bin/ld said:Undefined symbols:
Item<OpCode>::getname()
SymTab<OpCode>::find(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
SymTab<OpCode>::insert(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)
SymTab<OpCode>::SymTab()
SymTab<OpCode>::~SymTab()
collect2: ld returned 1 exit status