views:

154

answers:

2

In a header file, I have forward declared two members of a namespace:

namespace Foo {
    struct Odp
    typedef std::vector<Odp> ODPVEC;
};

class Bar
{
public:
     Foo::ODPVEC baz; // C2036
};

The error generated by the compiler is:

error C2036: 'Foo::Odp *': unknown size

I'm guessing this is an issue with forward declaring Odp. How can I get around this?

+1  A: 

Don't forward declare Odp. The compiler does not know what the type of std::vector<Odp> is, because Odp isn't yet declared. Give the compiler a full declaration for that class.

Billy ONeal
But what if I also want to declare it somewhere else?
Rosarch
@Rosarch: You can declare the class wherever you want. You can only define it once. Define it somewhere where it can be included everywhere that you need the definition.
James McNellis
Right, but I'm trying to avoid including header files in other header files.
Rosarch
@Rosarch: If you need the size of the object, then you don't have much choice. Besides, if the header file needs the class definition, the corresponding source almost certainly needs the class definition, so what does it matter?
James McNellis
+1  A: 

std::vector requires full type declaration of the first template parameter because it stores objects by value, not by pointer, and thus requires knowledge of object size. You might get away with forward declaration if you store pointers in the vector, like:

class foo;
typedef std::vector<foo*> foo_ptr_vec;

See the fine documentation for gory details.

Nikolai N Fetissov