甚至不确定这种情况的正确术语是什么。如果我知道,那我可能会找到答案的。
我有一个看起来像的模板化函数
template<typename T> void write(Buffer& b, const T& value);
没有通用的实现,只有显式的专业化。例如
template<> void write<int>(Buffer& b, const int& value) { ... }
template<> void write<const char *>(Buffer& b, const char * const & value) { ... }
到目前为止,一切都很好。但是当然当我打电话时,write(buffer, "hello")
我收到一个链接错误的抱怨
undefined reference to `void write<char [6]>(Buffer&, char const (&) [6])'
这个错误对我来说很有意义。但是我无法弄清楚的是如何为此声明一个特殊化。我想要这样的专业化工作要做的就是将char[]
参数转换为(const char*)
现有的专业化工作。但是我不知道该怎么做。
对于特定的例子,我可以做
template<size_t N> void write<char[6]>(Buffer& b, char const (&value) [6])
但是为每个可能的长度字符串常量定义其中之一显然是不可接受的。但是我尝试了以下方法,其中一些只是为了吸管而抓,而没有一个起作用。
template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<size_t N> template<> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<> template<size_t N> void write<char const[N]>(Buffer& ob, char const (&value) [N])
template<template<size_t N>> void write<char const[N]>(Buffer& ob, char const (&value) [N])
什么是正确的咒语?我正在使用GCC 4.7.3 x86_64。
您不能对模板函数进行部分专业化。请参阅此说明,以了解如何对模板化类中的函数进行某种程度的间接访问以解决此限制。
在这种简单的情况下,您还可以通过write
调用模板的非模板来获得:
void write(Buffer &b), const char *v)
{
write<const char *>(b, v);
}
这有效地将内联函数中本来可以与您的模板函数一起使用的类型转换隐藏起来。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句