可变模板函数名称查找无法找到专业化
我试图编程一个字符串连接函数,它利用我的3D库的字符串转换函数,用可变参数模板实现。
如果将一个字符串(const char [] literal或std :: string)传递给它,那么该库的转换函数表现异常。 因为它实际上并不具备这些类型的功能,所以我想专门化模板来将它们拉出,而不是通过转换器运行它们。 即使转换器处理它们,优化也是一个很好的理由。
template<typename T>
inline String c(T a)
{
return Ogre::StringConverter::toString( a );
}
template<>
inline String c(String s)
{
return s;
}
template<>
inline String c(const char s[])
{
return s;
}
template<typename T, typename... Args>
inline String c(T a, Args... args)
{
return Ogre::StringConverter::toString( a ) + c(args...);
}
template<typename... Args>
inline String c(String s, Args... args)
{
return s + c(args...);
}
template<typename... Args>
inline String c( const char s[], Args... args)
{
return s + c(args...);
}
但是,当我编译我的程序时,字符串文字有时会落在const char []专业化中,并由基本非特殊化模板处理。 命令:
U::c( "This is dMap[500][500]: ", dMap[500][500], " and this is 5: ", 5, "." )
回报
这是dMap [500] [500]:112true5。
如果将字符串文字传递给它,“true”是toString返回的内容。 调试确认第二个字符串字面量被泛型String c(T a, Args... args)
捕获,但不是第一个或第三个,由专门化处理。
这似乎与选择模板特化的字符串文字类型中提到的问题有关,但改变我的模板参数声明与该解决方案中提出的那些匹配, inline String c( const char (&s) [N], Args... args )
第一个参数被专门模板捕获,但不是第二个或第三个参数。 这里发生了一些不寻常的事情,我无法弄清楚它是什么。
在
template<typename T, typename... Args>
inline String c(T a, Args... args)
{
return Ogre::StringConverter::toString( a ) + c(args...);
}
不合格的名称查找c
在c(args...)
模板定义背景下,这意味着它只能找到的重载执行c
宣布了这一点,并不会发现你以后c
过载。 (ADL使用定义和实例化上下文来执行,但在您的情况下,它看起来好像没有ADL。)
首先声明它们:
template<typename T, typename... Args>
inline String c(T a, Args... args);
template<typename... Args>
inline String c(String s, Args... args);
template<typename... Args>
inline String c( const char s[], Args... args);
然后再定义它们,以便可以找到所有三种重载。
顺便说一句,你不应该使用专门化的单参数的情况。 删除template<>
并使用重载。 正如现在写的, U::c("");
不会按照你想要的方式行事。
演示。
链接地址: http://www.djcxy.com/p/62163.html上一篇: Variadic template function name lookup fails to find specializations