假设我有两个类,第一个用于写入原始类型(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);
,整数重载将优先于模板方法。
然而,我的编译器(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++ 标准是否明确规定只有在同一类中定义的重载方法(而不是基类)将优先于模板方法?
Writer
有一个接受int
的方法,而ComplexWriter
有一个带有模板的方法(和一个接受boost::any const&
的方法)。在你的测试代码中,你使用了ComplexWriter
,所以它当然会调用ComplexWriter
的成员。如果你真的期望它调用完全不相关的类Writer
的成员,你能解释一下为什么(以及如何)应该这样做吗? - celtschkComplexWriter
扩展了Writer
,但是在你列出的代码中它并没有继承自Writer
。这是正确的设置吗? - Attila