假設我有這樣的功能:添加模板函數的特化後
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