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

Posted

技术标签:

【中文标题】将可变参数模板参数包传递给下一个函数【英文标题】:Passing variadic template argument pack to next function 【发布时间】:2015-09-07 16:07:08 【问题描述】:

我已经在我的调试代码中重新实现了 printf()(经典)。

    template<typename T, typename ...Args>
    void Printf(wchar_t const * message, T value, Args ...args);
    void Printf(wchar_t const * message);
    void Printf();

它使用可变参数模板并且工作得非常好。

现在我想在几个函数中使用 Printf(),它们将接受几乎相同的参数,但以不同的方式执行 Printf()。这是 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();

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

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)

这对我来说很奇怪,因为我首先在一个更简单的情况下测试了这个构造,它运行良好。

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

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

【问题讨论】:

Debug::Line 是否定义在头文件中? 是的,它声明如下 static void Line(unsigned int in_tabs, wchar_t * in_string, Args...in_args); 我不是说声明,我是说定义。模板must be implemented in a header. 【参考方案1】:

正如 TartanLlama 指出的那样,模板函数体需要在头文件中可用/可见,要么将定义和声明放在头文件中,要么将带有函数实现的 cpp 文件包含在头文件的末尾

【讨论】:

以上是关于将可变参数模板参数包传递给下一个函数的主要内容,如果未能解决你的问题,请参考以下文章

如何将构造函数(可变参数)作为模板参数传递?

为啥我不能将模板函数指针传递给可变参数函数?

第20课 可变参数模板_模板参数包和函数参数包

可变参数模板调度程序

第21课 可变参数模板_展开参数包

如何将矢量(或类似)传递给可变参数模板