#include <iostream>
template< typename U >
struct base {
template< typename T >
base const & operator<<(T x) const {
std::cout << sizeof(x) << std::flush;
return *this;
}
};
template< typename U >
struct derived : public base<U> {
using base<U>::operator<<;
derived const & operator<<(float const & x) const {
std::cout << "derived" << std::flush;
return *this;
}
};
int main() {
unsigned char c(3);
derived<double> d;
d << c;
d.operator<<(c);
return 0;
}
您能解釋一下爲獲得上述代碼的正確答案而涉及的規則(與模板相關的重載和覆蓋,積分提升......)嗎?它有效嗎?如果規則太長,請提供文獻指針。最新的編譯器對正確的結果持不同意見。 gcc-4.6和icpc-12.1.0聲稱「11」是正確答案,但VS2010由於含糊不清而拒絕編譯d << c;
,但接受d.operator<<(c);
。後者輸出1
iirc。那麼誰是對的,誰錯了?以下代碼的ISO C++標準符合性結果
嘿,有什麼區別?如果'd << c'不能在MSVC上編譯,那麼只需打印一個'1'。其他編譯器打印兩個'1'。或者我錯過了什麼? – 2012-02-22 14:19:49
你需要認識到,沒有涉及的數據類型會有sizeof == 1:8也許,4肯定,1爲什麼不呢。但是11看起來真的很像兩個'1'。 – 2012-02-22 14:22:57
你想要什麼?試試編譯器? – 2012-02-22 14:23:42