【发布时间】:2012-06-11 12:05:07
【问题描述】:
假设我有两个类,第一个用于编写基本类型(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) 总是选择模板方法。例如,下面的代码 sn -p 会将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) 方法时,行为突然发生了变化(参见第一个sn-p 中的注释行)。然后它将Wrote an int 打印到控制台。
这是我的编译器应该表现的方式吗? C++ 标准是否明确规定只有在同一类(而不是基类)中定义的重载才能优先于模板化方法?
【问题讨论】:
-
我没有看到你在哪里重载了一个采用模板化的 int 方法。您有两个不相关的类,
Writer带有一个采用int的方法和ComplexWriter带有一个模板化方法(以及一个采用boost::any const&的方法)。在您的测试代码中,您使用ComplexWriter,所以它当然会调用ComplexWriter的成员。如果你真的希望它调用完全不相关类的成员Writer,你能解释一下为什么(以及如何)它应该这样做吗? -
您提到
ComplexWriter扩展了Writer,但在您列出的代码中,它不继承自Writer。这是正确的设置吗? -
感谢您指出这一点。是的,ComplexWriter 应该派生自 Writer。我相应地更新了问题。结果仍然是一样的(尽管当然忘记指定基类连接到我的问题的核心。outch。)。
标签: c++ templates boost overloading