将可变参数模板参数包传递给下一个函数
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 文件包含在头文件的末尾
【讨论】:
以上是关于将可变参数模板参数包传递给下一个函数的主要内容,如果未能解决你的问题,请参考以下文章