у меня есть простая функция, как это в заголовке test.h
template <class Dst = std::string, class T>
Dst format(const T&);
template <class Dst, Class T>
Dst format(const T&)
{
return Dst();
}
в test.cpp
#include "stdafx.h"#include "test.h"#include <iostream>
int main(int argc , char** argv)
{
std::string f = format("");
std::cout << f;
return 0;
}
если этот заголовок добавляется в предварительно скомпилированный заголовок в xcode
код больше не компилируется.
Я получаю сообщение об ошибке «Нет соответствующего вызова функции».
если я вручную добавлю параметр по умолчанию к вызову функции
format<std::string>();
тогда это работает.
если вместо объявления и определения я оставляю только определение … оно компилируется.
Как я понимаю, вы не можете сделать заголовок предварительно скомпилированным, если он содержит шаблон, потому что компилятор делает функции из шаблона только тогда, когда находит использование этих функций с конкретными типами из других источников. Нет конкретного типа — нет функции.
Кажется, что если я поместил параметр по умолчанию в ОПРЕДЕЛЕНИИ, а не объявление, оно, кажется, работает
template <class Dst , class T>
Dst format(const T&);
template <class Dst = std::string, Class T>
Dst format(const T&)
{
return Dst();
}