I have a recursive data type like this:
template<typename T>
struct SomeType {
std::map<T, SomeType<T>> mapping;
};
SomeType<int> foo;
This works fine, but replacing std::map with std::unordered_map results in a compile error due to an incomplete type. Am I (or gcc) making an error somewhere? or is this just part of the standard?
I would also like to have the internal container determined by a template parameter (like std::stack and std::queue), but I can’t figure out a way to do it since that would require SomeType to already be defined.
Incomplete example:
template<typename T, typename C = std::map<T, SomeType<[???]>>>
struct SomeType {
C mapping;
};
SomeType<int, [???]> foo;
I know this can be done with runtime indirection, but that’s not what I’m looking for.
Your class is incomplete anywhere before the final
}of its definition. So themappingmember is using incomplete typeSomeTypein its type’s template arguments.The standard does not allow this, and it is pure luck that it works with some STL containers.
Your second questions falls under the same answer — it is illegal to do that in the first place.