C++ typedef versus unelaborated inheritance
c++, stl
Solution
There is one hazard: if you call `delete` on a pointer to a base class with no `virtual` destructor, you have Undefined Behavior. Otherwise, you are fine.
At least that's the theory. In practice, in the MSVC ABI or the Itanium ABI (gcc, Clang, icc, ...) `delete` on a base class with no virtual destructor (`-Wdelete-non-virtual-dtor` with gcc and clang, providing the class has virtual methods) only results in a problem if your derived class adds non-static attributes with non-trivial destructor (eg. a `std::string`).
In your specific case, this seems fine... but...
... you might still want to encapsulate (using Composition) and expose meaningful (business-oriented) methods. Not only will it be less hazardous, it will also be easier to understand than `it->second.find('x')->begin()`...
Problem
I have a data structure made of nested STL containers: ``` typedef std::map<Solver::EnumValue, double> SmValueProb; typedef std::map<Solver::VariableReference, Solver::EnumValue> SmGuard; typedef std::map<SmGuard, SmValueProb> SmTransitions; typedef std::map<Solver::EnumValue, SmTransitions> SmMachine; ``` This form of the data is only used briefly in my program, and there's not much behavior that makes sense to attach to these types besides simply storing their data. However, the compiler (VC++2010) complains that the resulting names are too long. Redefining the types as subclasses of the STL containers with no further elaboration seems to work: ``` typedef std::map<Solver::EnumValue, double> SmValueProb; class SmGuard : public std::map<Solver::VariableReference, Solver::EnumValue> { }; class SmTransitions : public std::map<SmGuard, SmValueProb> { }; class SmMachine : public std::map<Solver::EnumValue, SmTransitions> { }; ``` Recognizing that the STL containers aren't intended to be used as a base class, is there actually any hazard in this scenario?