假設我有兩個類,第一個用於寫入原語類型(bool
,int
,float
等)和延伸的第一到也寫複雜類型的第二個:爲什麼C++更喜歡這種模板方法來重載方法?
struct Writer {
virtual void Write(int value) = 0;
};
struct ComplexWriter : public Writer {
template <typename TValue> void Write(const TValue &value) {
boost::any any(value);
Write(any);
}
//virtual void Write(int value) = 0; // see question below
virtual void Write(const boost::any &any) = 0;
};
的想法是,如果有人呼叫myWriter.Write(someIntValue);
,int重載將優先於模板方法。相反,我的編譯器(Visual C++ 11.0 RC)總是選擇模板方法。下面的代碼片段,例如,將打印Wrote any
到控制檯:
struct ComplexWriterImpl : public ComplexWriter {
virtual void Write(int value) { std::cout << "Wrote an int"; }
virtual void Write(const boost::any &any) { std::cout << "Wrote any"; }
};
void TestWriter(ComplexWriter &writer) {
int x = 0;
writer.Write(x);
}
int main() {
ComplexWriterImpl writer;
TestWriter(writer);
}
行爲突然改變,當我在ComplexWriter
類聲明Write(int)
方法,以及(見第一個片段註釋掉線)。然後它將Wrote an int
打印到控制檯。
這是我的編譯器應該如何表現? C++標準是否明確規定只有在同一個類(而不是基類)中定義的重載應該優先於模板化方法?
我沒有看到你重載的方法了結INT與一個模板。你有兩個不相關的類,'Writer',一個採用'int'和'ComplexWriter'方法的模板方法(以及一個採用'boost :: any const&'的方法)。在你的測試代碼中你使用'ComplexWriter',所以它當然會調用'ComplexWriter'的成員。如果你真的希望它調用完全不相關的類'Writer'的成員,你能解釋爲什麼(以及如何)它應該這樣做嗎? – celtschk
您提到'ComplexWriter'擴展了'Writer',但是在您列出的代碼中不會從'Writer'繼承。這是正確的設置? – Attila
謝謝你指出。是的,ComplexWriter應該來自Writer。我相應地更新了這個問題。結果仍然是一樣的(儘管當然忘記指定基類連接到我的問題核心)。 – Cygon