甚至不确定这种情况的正确术语是什么。如果我知道的话,我可能会找到答案。
我有一个看起来像的模板化函数
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。