将可变参数模板参数包传递给下一个函数

时间:2015-06-22 09:08:07

标签: c++ templates argument-passing callstack variadic

我在调试代码中完成了自己的printf()(经典)重新实现。

template<typename ...Args>
void Debug::Line(unsigned int in_tabs, wchar_t const * in_string, Args...in_args){
    for (unsigned int i = 0; i < in_tabs; ++i)
        Tab();
    Printf(in_string, in_args...);
    NewLine();
}

它使用可变参数模板,工作得很好。

现在我想在几个函数中使用Printf(),它们将接受几乎相同的参数但以不同的方式执行Printf()。这是Printf()

的客户端函数之一
error LNK2019: unresolved external symbol "public: static void __cdecl Nerv::Debug::Line<>(unsigned int,wchar_t *)" (??$Line@$$$V@Debug@Nerv@@SAXIPA_W@Z) referenced in function "public: void __thiscall Nerv::UI::NervUIRect::DebugRect(void)" (?DebugRect@NervUIRect@UI@Nerv@@QAEXXZ)
error LNK2019: unresolved external symbol "public: static void __cdecl Nerv::Debug::Line<int,int>(unsigned int,wchar_t *,int,int)" (??$Line@HH@Debug@Nerv@@SAXIPA_WHH@Z) referenced in function "public: void __thiscall Nerv::UI::NervUIRect::DebugRect(void)" (?DebugRect@NervUIRect@UI@Nerv@@QAEXXZ)

一旦我开始使用这个构造,我开始得到UNRESOLVED链接器错误

template<typename T,typename...Ts>
void Printf(T value,Ts...args){
    OutputDebugString(value);
    Printf(args...);
}
void Printf(){

}

template<typename...Args>
void UsePrintf(Args...args){
    Printf(args...);
}

这对我来说很奇怪,因为我已经在一个更简单的案例中测试了这个构造,并且它运行良好。

$http.get

与简单案例的不同之处在于,所有的函数(不起作用)都是Debug类的静态成员,并且还有一些额外的函数参数。 那我该怎么处理呢?

1 个答案:

答案 0 :(得分:0)

正如TartanLlama所指出的那样,模板函数体需要在头文件中可用/通过将头部中的定义和声明置于聚集中,或者通过在头部末尾包含带有函数实现的cpp文件来实现