gpt4 book ai didi

c++ - 子类调用意外的重载函数

转载 作者:行者123 更新时间:2023-11-30 04:49:35 25 4
gpt4 key购买 nike

我很难理解为什么在下面的代码中调用了所谓的错误重载。

// overload.h
struct T1
{
template<class... Args>
void doFoo(Args&&... args)
{
std::cout << "T1 doFoo generic"<< std::endl;
}

void doFoo(int a)
{
std::cout << "T1 doFoo INT "<< std::endl;
}

void doFoo(double a)
{
std::cout << "T1 doFoo Double "<< std::endl;
}

template<class... Args>
void foo(Args&&... args)
{
doFoo(args...);
}
};


struct T2 : public T1
{
void doFoo(char c)
{
std::cout << "T2 doFoo char " << std::endl;
}
};

// main.cpp

#include <overload.h>
int main()
{
T2 t2;
t2.foo(3);
t2.foo('A'); // This outputs: T1 doFoo generic
}

我原以为 t2.foo('A') 的输出是:“T2 doFoo char”,但我得到的是“T1 doFoo generic”。

如果我将 T2::doFoo(char c) 移动到 T1 中,一切都会按预期进行。这种行为的原因是什么?任何解决方法?

最佳答案

正如评论中已经建议的那样,由于 T1 不知道派生结构 T2,因此 T1::foo 也找不到T2::doFoo(char c) 无法实现这种静态绑定(bind)。

T2 中的 char 虚假重载 T1::foo 的简单解决方法是再次声明 fooT2 中重载如下:

DEMO

struct T1 
{
template<class... Args>
void doFoo(Args&&... args){
std::cout << "T1 doFoo generic"<< std::endl;
}

void doFoo(int a){
std::cout << "T1 doFoo INT "<< std::endl;
}

void doFoo(double a){
std::cout << "T1 doFoo Double "<< std::endl;
}

template<class... Args>
void foo(Args&&... args){
doFoo(std::forward<Args>(args)...);
}
};

struct T2 : public T1
{
template<class... Args>
void foo(Args&&... args){
T1::foo(std::forward<Args>(args)...);
}

void foo(char c){
std::cout << "T2 foo char " << std::endl;
}
};

关于c++ - 子类调用意外的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55336516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com