2017-01-20 6 views
0

У меня есть простая функция, как это в test.h заголовкеПо умолчанию параметр шаблона не найден, если заголовок в скомпилированных заголовков Xcode

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>(); 

затем он работает.

Если вместо объявления и определения я оставляю только определение ... оно компилируется.

+1

Пожалуйста, попробуйте создать [Minimal, полный и Проверяемость пример] (Http: // StackOverflow. com/help/mcve) неудачного кода, чтобы показать нам. И, пожалуйста, укажите фактические ошибки, которые вы получаете в теле вопроса. –

ответ

1

Как я понимаю, вы не можете сделать заголовок прекомпилированным, если он содержит шаблон, потому что компилятор делает функции из шаблона только при поиске использования этих функций с конкретными типами из других источников. Нет конкретного типа - нет функции.

0

кажется, что если я поставил параметр по умолчанию в определении, а затем заявление, кажется, работает

template <class Dst , class T> 
Dst format(const T&); 

template <class Dst = std::string, Class T> 
Dst format(const T&) 
{ 
return Dst(); 
}