(Ostatnie pytanie na dole)Oddzielne definicje zmiennej liczbie argumentów szablonów
Niedawno poprosiłem a question dotyczące w jaki sposób naprawić błędy linkera (na zduplikowane symboli dotyczących wiele definicji szablonu pustkę.
Bo Używałem funkcji w wielu plikach źródłowych, zasugerowałem użycie słowa kluczowego inline
, aby umożliwić deklaracje w nagłówku lub umieścić deklaracje w skompilowanym pliku źródłowym:
Po tym, jak zdałem sobie sprawę, że inline
miał pewne złe reperkusje, umieściłem moje deklaracje w pliku źródłowym.
Teraz to było w porządku, z wyjątkiem zmiennej liczbie argumentów szablonów:
template<typename T, typename... Args>
void cleanup(T *t, Args&&... args);
znalazłem kilka oczywistych rozwiązań - ale nie o zmiennej liczbie argumentów szablony - użyj pliku .tpp (ale to się zaczęło ponownie deklarując zduplikowane symboli) lub zachować plik źródłowy i dodaj jawne wystąpienia.
Ale istnieje możliwość użycia setek kombinacji parametrów, więc nie chcę jawnie tworzyć wszystkiego.
Pytanie: Tak, jak bym go o każdej
- utrzymując zmiennej liczbie argumentów definicji szablonu w pliku źródłowym, OR
- Umieszczenie definicji w pliku .tpp bez uzyskania duplikatów i symbole ostatecznie unikaj używania
inline
?
Przykłady zduplikowanych/niezdefiniowanych błędów symboli dla deklaracji .tpp i umieszczenia powyższej definicji szablonu w pliku źródłowym.
duplicate symbol __Z7cleanupI10SDL_WindowJEEvPT_DpOT0_ in:
CMakeFiles/Game.dir/Game/main.cc.o
CMakeFiles/Game.dir/Game/RichTools/rtexture.cc.o
_
Undefined symbols for architecture x86_64:
"void cleanup<SDL_Renderer, SDL_Window*&>(SDL_Renderer*, SDL_Window*&&&)",
referenced from:
cleanQuit() in main.cpp.o
ld: symbol(s) not found for architecture x86_64
Chcesz kompilator do generowania dawałaby gdy są one używane, ale chcesz automatycznie odrzucić duplikaty? Użyj 'inline', a następnie! Wspomniałeś, że rozważałeś jego użycie, ale że miał "złe reperkusje", ale czym właściwie są? –
Wygląda na to, że w pierwszym pytaniu nie zrozumiałeś odpowiedzi. Porada, aby wprowadzić plik źródłowy lub przejść do pliku źródłowego, dotyczyła wyłącznie w pełni wyspecjalizowanych funkcji - tych z pustym szablonem listy parametrów <>. – PiotrNycz