I am still fairly new to c++ so please allow! Essentially I have created a struct in the header file for one of my classes full of strings.
typedef struct details{
string name;
string address;
}details;
and I wish to not only use this struct in the cpp file that belongs to the header, but in other classes as well. For example, I want to create a vector of this struct in another header file.
private:
vector <details> foo;
I also want to use the struct in the main
details d;
d.name = "hi";
d.address = "hello";
however when I currently try to do this I get errors such as
error: 'details' was not declared in this scope
vector <details> foo;
and
error: template argument 1 is invalid
vector <details> foo;
has anyone had similar issues who can provide insite into what I can do to fix this? Thanks a lot.
EDIT TO DEMONSTRATE CODE
class1.h
#include "class2.h"
struct trans1{
string name;
};
class class1 {
private:
vector <trans2> t2;
public:
class1();
};
class2.h
#include "class1.h"
struct trans2{
string type;
};
class class2{
private:
vector <trans1> t1;
public:
class2();
};
errorlog:
In file included from class1.h:3:0,
from class1.cpp:1:
class2.h:21:13: error: 'trans1' was not declared in this scope
vector <trans1> t1;
^
class2.h:21:19: error: template argument 1 is invalid
vector <trans1> t1;
^
class2.h:21:19: error: template argument 2 is invalid
I understand that this is ridiculous code in a real world application however this is the simplest way I could demonstrate
This should work.
EDIT
If you want to use it in another class:
EDIT 2
I'm pretty unsure why you define the structs in the classes as you do -- it is kind of confusing. Here's how I would do if. Note the
#ifndef ... #define ... #endif
pattern is very important. It's also a bad idea to include headers that include themselves. I would organize your code (as you have it) in the following way:Now the way it's organized, you can use the
trans
struct by#include "trans.h"
'ing in the main, along with eliminating the circular includes. Hope this helped.You'll find that main.cc below compiles without error now.
erip
The struct definition in c++ looks like
and must be seen before it's used elsewhere in your code. Assumed you placed the declaration from above in a header file
details.hpp
, you should have the following to use itIn certain situations, when the
details
struct members aren't actually accessed, you can also use a forward declaration asinstead of in including the complete struct declaration. This can be used then, to declare
details*
pointers ordetails&
references in further declarations, as long there's nothing dereferenced with them.You have to include the header file that contains the definition of the
struct
everywhere you use it.The only cases where you don't have to is when you are only declaring references or pointers to it; in that case you can just forward declare it with:
Also in C++ you can just declare it with:
There's really no need for the
typedef
.