Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么C++;是否更喜欢此模板方法而不是方法重载?_C++_Templates_Boost_Overloading - Fatal编程技术网

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
};