假设我有两个类,第一个用于编写原始类型(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++ 标准是否明确规定只有在同一类(而不是基类)中定义的重载才能优先于模板化方法?