У меня есть шаблонные функции в моем проекте Xcode C++ 11, а некоторые из них имеют специализации. Тем не менее, я обнаружил, что специализации только вызываются в отладочных сборках; если я создам релиз, они будут проигнорированы.Почему моя специализированная функция шаблона вызывается только в отладочных сборках?
Я успешно создал очень простой пример:
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 (до тех пор, пока, как минимум, этим летом 2013 года), чтобы воспроизвести проблему, если вы не хотите ее создавать самостоятельно. Сначала запустите проект с конфигурацией отладки, а затем запустите его снова в выпуске. Вывод, который я ожидаю:
не настолько особенным
очень специальный
И это действительно то, что я получаю с конфигурацией Debug сборки. Тем не менее, с версией, я получаю это:
не так специальный
не настолько особенный
Это означает специализированную реализацию special::call
в special.cpp был проигнорирован.
Почему результат непоследовательный? Что делать, чтобы гарантировать, что специализированная функция вызывается в версиях сборки?
Поместите его в .h вместо .cpp? – Pubby
special.cpp связан в обоих случаях? – ForEveR
Да, special.cpp скомпилирован и связан в обоих случаях. Если я поместил специализацию в файл заголовка, он будет работать, если файл включен только в один .cpp-файл, но в остальном я получаю дубликат символьной ошибки. – zneak