我写了一个用于播放模板的测试程序。该程序旨在模拟一种创建任何类型的通用对象的方法(例如,装箱的对象将是对象< int>)。
我希望能够在不实现特定asString操作的情况下打印这些盒装对象,因为底层类型已经知道如何通过stringstream打印自己(或者如果他们没有,他们可以实现它),所以我想要避免重复的代码。
我设法让它工作,但如果我改变两个模板化的asString函数的顺序,程序就不再编译了。
以下是代码:
#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
/* an object in the set(type) T */
template <typename T>
struct object {
T identity;
object(T t) {
this->identity = t;
}
};
template <typename T>
std::string asString(T t) {
std::stringstream s;
s << t;
return s.str();
}
template <typename T>
std::string asString(object<T> obj) {
std::stringstream s;
s << asString(obj.identity);
return s.str();
}
int main(int argc, char **argv)
{
object<int> a = 3;
puts(asString(a).c_str());
return 0;
}
有人可以解释为什么两个asString函数定义的顺序很重要吗?