Cyg*_*gon 12 c++ templates boost overloading
假设我有两个类,第一个用于写入原语类型(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;
};
Run Code Online (Sandbox Code Playgroud)
这个想法是,如果有人调用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);
}
Run Code Online (Sandbox Code Playgroud)
当我Write(int)在ComplexWriter类中声明方法时,行为会突然改变(请参阅第一个片段中注释掉的行).然后它打印Wrote an int到控制台.
这是我的编译器应该如何表现的?C++标准是否明确地说只有在同一个类(而不是基类)中定义的重载才会优先于模板化方法?
问题是,在你调用writer.Write(x)编译器的时候看到的ComplexWriter不是a ComplexWriterImpl,所以它只知道ComplexWriter模板函数和函数中定义的boost::any函数.
ComplexWriter不包含任何接受的虚函数int,因此无法调用其中定义的int重载ComplexWriterImpl
当您向ComplexWriter类添加虚拟重载时,编译器会意识到类中存在整数重载ComplexWriter,因此调用它的实现.ComplexWriterImpl
编辑:既然您已经在ComplexWriter和Writer之间的继承中进行了编辑,我会为您提供更完整的解释:
当您创建子类并在其中定义函数时,无论其参数类型如何,基类中该名称的所有函数都将被隐藏.
您可以使用我认为的using关键字来解决这个问题:
struct ComplexWriter : public Writer {
template <typename TValue> void Write(const TValue &value) {
boost::any any(value);
Write(any);
}
using Writer::Write;
virtual void Write(const boost::any &any) = 0;
};
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅此常见问题解答条目:http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9
编辑2:只是为了确认这确实解决了您的问题:http://ideone.com/LRb5a
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |