Have you ever had to support applications compiled on an old version of your C++ library? And had to sacrifice sensible naming and reuse due to binary compatibility? And the "bridge pattern" (hiding implementation behind a pointer) won't work due to performance or inheritance?
You can on most OSes use shared library versioning but it requires use of linker scripts and/or compiler-specific #pragmas. Instead of relying on OS support for versioning of shared libraries you can do something simpler.
typedef does not create a new type name - it only creates an alias during compilation. The generated code refers to the underlying type name. This can be used for making versionable classes.
First version of headerfile
class X__v1 { ... }; typedef X__v1 X;
second version of headerfile
class X__v1 { ... }; class X__v2 { ... }; typedef X__v2 X;
And the source using the API remains the same:
X x;
When programs are compiled against the first version of the headerfile they will bind to the X__v1 name. If you recompile the program against the second version of the headerfile they will instead bind to X__v2 automatically. Also quite important is that the library implementation is much easier than with OS versioning (eg. your can have both X__v1 and X__v2 in the same source file).
If you use namespaces you can use aliases:
First version:
namespace A__v1 { class X ... class Y ... class Z ... } namespace A = A__v1
Second version (where the X class is changed):
namespace A__v1 { class X ... class Y ... class Z ... } namespace A__v2 { class X ... using A__v1::Y; using A__v1::Z; } namespace A = A__v2