假设我有这样的功能:添加模板函数的特化后
template<typename T> inline
typename std::enable_if<has_member_foo<T>::value,int>::type
foo(T const &t) {
return t.foo();
}
template<typename T> inline
typename std::enable_if<!has_member_foo<T>::value,int>::type
foo(T const&) {
return 0;
}
template<typename T> inline
int call_foo(T const &t) {
return sizeof(T) + foo(t);
}
这主要工作正常,但如果我以后添加的过载特定类型:
inline int foo(std::string const &s) {
return s.size();
}
,我添加它的call_foo()
定义后, 过载不使用call_foo()
。 但是,如果我在call_foo()
的定义之前移动了重载代码,则会使用它。
为什么在第一种情况下使用不超载? 当call_foo()
被实例化在代码中其他地方使用的地方时, 编译器已经看到了的重载,所以为什么不使用它?
请注意,我的原始代码具有foo()
函数作为类似模板的foo_traits
类的静态成员函数类似地使用enable_if
保护。 这代码工作,即,使用模板类特例,即使call_foo()
后提供,所以为什么不独立的重载函数?
如果它的事项,我在Mac OS X 10.7.4使用g++
4.6。
吹毛求疵:你'FOO(的std :: string常量&)'是过载,而不是专业化(它不是一个模板函数)。 – xtofl 2012-07-12 14:17:49
@xtofl:fixed;谢谢。 – 2012-07-12 14:30:03