假设我有两个类,第一个用于编写原始类型(bool, int,float等),第二个扩展第一个以编写复杂类型:
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);
}
当我Write(int)也在类中声明方法时,行为突然发生了变化ComplexWriter(请参阅第一个片段中的注释行)。然后打印Wrote an int到控制台。
这是我的编译器应该如何表现的吗?C++ 标准是否明确规定只有在同一类(而不是基类)中定义的重载才能优先于模板化方法?