I encountered a problem about "Overloaded Templates and non-template functions".
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
// print any type we don't otherwise handle
template <typename T>
string debug_rep(const T &t) {
ostringstream ret;
ret << t; // uses T's output operator to print a representation of t
return ret.str(); // return a copy of the string to which ret is bound
}
// print pointers as their pointer value, followed by the object to which the pointer pointsv
template <typename T>
string debug_rep(T *p) {
ostringstream ret;
ret << "pointer: " << p; // print the pointer's own value
if (p) {
ret << " " << debug_rep(*p); // print the value to which p points
} else {
ret << " null pointer"; // or indicate that the p is null
}
return ret.str(); // return a copy of the string to which ret is bound
}
string debug_rep(char * p) {
return debug_rep((string)p);
}
string debug_rep(const char * p) {
return debug_rep((string)p);
}
int main() {
string debug_rep(const string& s);
const char * cp = "hello";
cout << debug_rep(cp) << endl;
return 0;
}
string debug_rep(const string& s) {
return '"' + s + '"';
}
In the book "C++ Primer", they say the cout << debug_rep(cp) << endl;
in main
function will call debug_rep(const char * p)
. However, through my test, it actually calls debug_rep(const string& s)
. So, I wonder why this happened.
Aucun commentaire:
Enregistrer un commentaire