Почему невстроенные пространства имен не подходят для управления версиями библиотек?
В этом ответе на этот вопрос Для чего нужны встроенные пространства имен?, встроенные пространства имен называются механизмом управления версиями библиотеки.
Я понимаю общий подход, упомянутый в ответах, с использованием встроенного пространства имен, но неясно одно: почему мы не можем использовать следующий подход для управления версиями библиотек с невстроенными пространствами имен?
В первой версии используйте следующее определение.
#include <iostream>
namespace foo {
template <typename T>
void bar(T t) {
std::cout << "bar v1 - " << t;
}
}
А в следующей версии поместите старую версию во вложенное пространство имен v1, а на его место более новую версию.
#include <iostream>
namespace foo {
namespace v1 {
template <typename T>
void bar(T t) {
std::cout << "bar v1 - " << t;
}
}
template <typename T>
void bar(T t) {
std::cout << "bar v2 - " << t;
}
}
Все правильные варианты использования будут автоматически обновлены до версии 2 и будут корректно работать с версией 2. Для любых пользователейfoo::bar()
, если они все еще хотят ссылаться на v1, они могут изменить код наfoo::v1::bar()
, как это предлагается в связанном ответе на вопрос, где для решения они использовали встроенные пространства имен.
Что не так, чего не хватает или не будет работать при описанном выше подходе, который не использует встроенные пространства имен?