The problem is that the compiler has no idea what a 'human' is when it's reading the enemy header, and no idea what an enemy is when it's reading the human header.
The obvious solution would seem to be to include enemy.h in human.h and human.h in enemy.h, but that will just cause a recursive inclusion which won't work either. What you need is a forward definition - basically just a simple line of code that tells the compiler not to worry too much about what an enemy is, you'll explain it later.
e.g
class enemy; // this is a forward definitionclass human{int twoint threeint fourvoid attack(int &amount, enemy &name);void magic(int &type, enemy &name);};
class human; // this is also a forward definitionclass enemy{int twoint threeint fourvoid attack(int &amount, human &name);void magic(int &type, human &name);};
Since the forward definition contains no actual information about what it's defining, your header can contain only pointers and references to the forward defined class, and you can't try and use any of it's functions or data. For example, this wouldn't work in your header file:
class human; // this is also a forward definitionclass enemy{int twoint threeint fourvoid attack(int &amount, human name){ name.attack(10,*this);}void magic(int &type, human &name);};
This fails for two reasons: first, name is no longer a reference in the attack function. since the compiler has no idea how big a 'human' is with only the forward definition to go on, it can't work out the function's profile properly. Second, we're calling the human's 'attack' function - but we haven't told the compiler anything about the human's functions. We can call functions in the cpp once we've got the full declaration, we just can't do it in the header file before then.
Also, wrong forum [grin]. The game design forum is for gameplay design and balance etc rather than coding.