そして、私が解決できない別のテンプレートの特殊化の問題:
ターミナルログ.hh
//stripped code
class Terminallog {
public:
Terminallog();
Terminallog(int);
virtual ~Terminallog();
template <class T>
Terminallog & operator<<(const T &v);
template <class T>
Terminallog & operator<<(const std::vector<T> &v);
template <class T>
Terminallog & operator<<(const T v[]);
Terminallog & operator<<(const char v[]);
//stripped code
};
terminallog.hh 続き (コメントのおかげで編集)
//stripped code
template <class T>
Terminallog &Terminallog::operator<<(const T &v) {
std::cout << std::endl;
this->indent();
std::cout << v;
return *this;
}
template <class T>
Terminallog &Terminallog::operator<<(const std::vector<T> &v) {
for (unsigned int i = 0; i < v.size(); i++) {
std::cout << std::endl;
this->indent();
std::cout << "Element " << i << ": " << v.at(i);
}
return *this;
}
template <class T>
Terminallog &Terminallog::operator<<(const T v[]) {
unsigned int elements = sizeof (v) / sizeof (v[0]);
for (unsigned int i = 0; i < elements; i++) {
std::cout << std::endl;
this->indent();
std::cout << "Element " << i << ": " << v[i];
}
return *this;
}
inline
Terminallog &Terminallog::operator<<(const char v[]) {
std::cout << std::endl;
this->indent();
std::cout << v;
return *this;
}
//stripped code
これは問題なくコンパイルされ、エラーは発生しません。ただし、次のようなことをしようとすると:
Terminallog clog(3);
int test[] = {5,6,7,8};
clog << test;
配列のポインターアドレスを常に出力します。つまり、特殊なテンプレート
Terminallog & operator<<(const T v[]);
呼び出されることはありません。また、追加のカウントでこれを確認しました。何を試しても、プログラムは常に呼び出しています
Terminallog & operator<<(const T &v);
専門ではありません。明らかに、コードにエラーがあるはずですが、見つかりません。