2

この状況の正しい用語が何であるかさえわかりません。それを知っていれば、おそらく答えを見つけることができたでしょう。

次のようなテンプレート化された関数があります

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 を使用しています。

4

2 に答える 2