如果标头位于预编译标头xcode

时间:2017-01-20 14:02:46

标签: c++ xcode templates variadic-templates pch

我在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

中的预编译头文件中

代码不再编译。

我得到一个&#34;没有匹配的函数调用&#34;错误。

如果我手动将默认参数添加到函数调用

format<std::string>();

然后它有效。

如果不是声明和定义,我只留下定义......它会编译。

2 个答案:

答案 0 :(得分:1)

据我了解,如果包含模板,则无法对头进行预编译,因为编译器仅在使用具有其他来源的具体类型的theese函数时才从模板中生成函数。没有具体的类型 - 没有功能。

答案 1 :(得分:0)

似乎如果我将默认参数放在DEFINITION而不是声明它似乎工作

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

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