可变模板函数名称查找无法找到专业化

我试图编程一个字符串连接函数,它利用我的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...);
}

不合格的名称查找cc(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

下一篇: sizeof in variadic template c++