The most robust and maintainable approach in standard C++ is indeed the workaround you've described. Why? Because using declarations are not templated, i.e. you cannot apply std::enable_if
directly to a using declaration to conditionally include it. The presence of a using declaration is fixed once the class is instantiated.
By splitting the using declarations into CVector and CList, you isolate the container-specific method hiding into their own contexts. This leverages template specialization via std::conditional to choose the correct base, ensuring only valid using declarations are present.