Mam klasy w przestrzeni nazw w pliku nagłówkowym. Klasa wymaga typu szablonu i chcę, aby tylko niektóre typy były używane. Poniżej pokazano przykład.Prywatna klasa w przestrzeni nazw
a.hpp pliku
// a.hpp
namespace a_ns {
template<class T>
class a {
// stuff
};
typedef a<double> a_double;
} // end of namespace
// stuff
b.hpp pliku
// b.hpp
#include <a.hpp>
namespace b_ns {
typedef a_ns::a_double b;
}
main.cpp pliku
// main.cpp
#include "b.hpp"
int main() {
b_ns::b my_b; // <<<--- I LIKE this!
a_ns::a<float> my_a_which_is_not_allowed; // <<<--- I DO NOT LIKE THIS THOUGH! D:
}
Więc jak widać z zewnątrz raczej tęsknił przykładu, celem końcowym jest NIE POZWALAĆ użytkownikowi końcowemu do zadeklarowania class a
z float
jako nazwy d, aby móc używać tylko predefiniowanych klas z określonymi typami, zgodnie z deklaracją typedef a<double> a_double;
.
Pomyślałem, że powyższy przykład na to pozwoli, jednak myliłem się, ponieważ mogę utworzyć a<float>
jak wyżej, ponieważ włączam b.hpp
, który z kolei obejmuje a.hpp
! Więc widzisz problem! (mam nadzieję?)
Prawdopodobnie istnieje proste rozwiązanie, jeśli jest to w ogóle możliwe.
Właściwie to lubię - obawiam się, że nie da się pokonać kłopotów z programistami. –
@ DieterLücking, Gdy już się przekonasz, że muszą celowo wkopać się w dziurę, zaczynasz niepokoić się o wiele mniej. Jeśli chcą się przewrócić, pozwól im. Jeśli jest coś, co naprawdę może im pomóc, przynajmniej teraz nie potrzebują hakowania, aby do niego dotrzeć. – chris
lub jak mówi Herb Sutter: bronić się przed Murphy, nie Machiavelli – TemplateRex