Mam funkcje szablonów w moim projekcie Xcode C++ 11, a niektóre z nich mają specjalizacje. Jednakże odkryłem, że specjalizacje są wywoływane tylko w kompilacjach debugowania; jeśli zbuduję wersję, są one ignorowane.Dlaczego moja wyspecjalizowana funkcja szablonu wywoływana jest tylko w kompilacjach debugowania?
Mam powodzeniem stworzył bardzo prosty przykład:
special.h
#include <cstdio>
struct special
{
template<typename T>
void call(const T&) { puts("not so special"); }
};
special.cpp
#include "special.h"
#include <string>
template<>
void special::call(const std::string&) { puts("very special"); }
main.cpp
#include "special.h"
#include <string>
int main()
{
std::string str = "hello world";
special s;
s.call(123);
s.call(str);
}
You can download the project (przynajmniej latem 2013 r.), Aby odtworzyć problem, jeśli nie chcesz go tworzyć samodzielnie. Najpierw uruchom projekt z konfiguracją debugowania, a następnie uruchom go ponownie w wydaniu. Wyjście że spodziewam się:
nie jest tak wyjątkowy
wyjątkowy
I to jest rzeczywiście to, co się z konfiguracją Debug build. Jednak od wersji, otrzymuję to:
nie tak specjalnego
nie tak wyjątkowe
co oznacza specjalistyczną realizację special::call
w special.cpp został zignorowany.
Dlaczego wynik jest niespójny? Co powinienem zrobić, aby funkcja wyspecjalizowana została wywołana w wersjach wydania?
Umieścić w .h zamiast .cpp? – Pubby
special.cpp jest połączone w obu przypadkach? – ForEveR
Tak, plik special.cpp jest kompilowany i łączony w obu przypadkach. Jeśli umieścisz specjalizację w pliku nagłówkowym, działa, jeśli plik jest zawarty tylko w jednym pliku .cpp, ale w przeciwnym razie dostaję duplikat błędu symbolu. – zneak