C++ 为什么C++;是否更喜欢此模板方法而不是方法重载?
假设我有两个类,第一个类用于编写基本类型(C++ 为什么C++;是否更喜欢此模板方法而不是方法重载?,c++,templates,boost,overloading,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::an
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;
};
当我在ComplexWriter
类中声明Write(int)
方法时,行为也会突然改变(请参见第一个代码片段中注释掉的行)。然后它向控制台打印并写入一个int
我的编译器应该这样做吗?C++标准是否明确地说明只有在同一类中定义的重载(而不是基类)应该优先于模板化方法? 问题是,在调用“代码>编写器”的时候,编写(x)< /C> >编译器看到<代码>复杂写入器< /Cl> >不是<代码> AuthoCuffer-IMPL> /Cl>因此,它只知道在
ComplexWriter
-模板函数和boost::any
函数中定义的函数
ComplexWriter
不包含任何接受int
的虚拟函数,因此它无法调用ComplexWriterImpl
中定义的int重载
当您将虚拟重载添加到ComplexWriter
类中时,编译器会意识到ComplexWriter
类中有一个整数重载,因此调用它在ComplexWriterImpl
中的实现
编辑:现在您已经在ComplexWriter和Writer之间的继承中进行了编辑,我为您提供了一个更完整的解释:
当您创建一个子类并在其中定义一个函数时,基类中该名称的所有函数都将被隐藏,而不管它们的参数类型如何
你可以使用关键字“我相信”来解决这个问题:
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;
};
struct ComplexWriter:公共编写器{
模板无效写入(常量值和值){
boost::任意(值);
写(任何);
}
使用Writer::Write;
虚空写入(const boost::any&any)=0;
};
有关更多详细信息,请参阅此常见问题解答条目:
编辑2:只是为了确认这确实解决了您的问题:当您通过
ComplexWriter
“接口”访问对象时,编译器将尝试使用该类中的定义解决对Write(int)
的函数调用。如果它不能这样做,它会考虑基类。< /P>
在本例中,您有两个候选项:Write(any)
和模板版本。由于此时没有明确的Write(int)
可用,因此必须在这两个选项之间进行选择Write(any)
需要隐式转换,而模板化版本不需要隐式转换,因此将调用模板化版本(这反过来调用Write(any)
)
要使来自Writer
的Write(int)
可用,请导入Writer::Write
函数:
class ComplexWriter : public Writer
{
using Writer::Write;
// rest is as before
};
我看不出你在哪里重载了一个使用一个模板的int的方法。您有两个不相关的类,
Writer
,其方法采用int
和ComplexWriter
,其方法采用模板化方法(以及采用boost::any const&
)。在测试代码中,您使用ComplexWriter
,因此它当然会调用ComplexWriter
的成员。如果您真的希望它调用完全不相关的类Writer
,您能解释一下它为什么(以及如何)这样做吗?您提到ComplexWriter
扩展了Writer
,但在您列出的代码中,它并不是从Writer
继承的。这是正确的设置吗?谢谢你指出这一点。是的,ComplexWriter应该是从Writer派生出来的。我相应地更新了问题。结果仍然是一样的(虽然当然忘记了指定基类连接到我的question.outch的核心)。是的,我忘记了在代码段中指定基类。ComplexWriter确实继承自Writer,但我观察到的行为与我解释的一样,即使正确指定了基类。@Cygon是的,注意到了这一点。我刚才只是想提出一个解释/编辑。如果我失败了,我可能会删除这个答案!无论如何,感谢您的快速回复!忘记指定基类确实是一个愚蠢的错误,因为它扭曲了整个问题:)很好!我已经写C++几年了,以前从来没有遇到过这种类型的使用语句。即使有多个重载,它也能在GCC和MSVC上生成我的实际结果。
class ComplexWriter : public Writer
{
using Writer::Write;
// rest is as before
};