Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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++_C++11_Multiple Inheritance_Ambiguous_Name Lookup - Fatal编程技术网

C++ C++;使用多继承模糊函数调用重写同一基模板类中的函数

C++ C++;使用多继承模糊函数调用重写同一基模板类中的函数,c++,c++11,multiple-inheritance,ambiguous,name-lookup,C++,C++11,Multiple Inheritance,Ambiguous,Name Lookup,我需要调用从基类派生的init(int*iNumber)函数 基类.h #pragma once #include "stdafx.h" template <class T> class BaseClass { public: BaseClass() {} virtual ~BaseClass() {} virtual void init(T* object) = 0; }; ChildClassImpl.cpp #include "stdafx.h" #i

我需要调用从基类派生的
init(int*iNumber)
函数

基类.h

#pragma once
#include "stdafx.h"
template <class T>
class BaseClass
{
public:
    BaseClass() {}
    virtual ~BaseClass() {}
    virtual void init(T* object) = 0;
};
ChildClassImpl.cpp

#include "stdafx.h"
#include <iostream>
#include "ChildClassImpl.h"

ChildClassImpl::ChildClassImpl(){}

ChildClassImpl::~ChildClassImpl(){}

void ChildClassImpl::init(int* iNumber)
{
    std::cout << "Integer constructor: " << *iNumber << std::endl;
}

void ChildClassImpl::init(float* fNumber)
{
    std::cout << "Float constructor: " << *fNumber << std::endl;
}
#包括“stdafx.h”
#包括
#包括“ChildClassImpl.h”
ChildClassImpl::ChildClassImpl(){}
ChildClassImpl::~ChildClassImpl(){}
void ChildClassImpl::init(int*iNumber)
{

Std::CUT> P>此代码失败,因为C++在超载分辨率和访问控制检查之前执行名称查找。第一步是确定哪个类作用域<代码> > < /COD> >。在这种情况下,结果将是模糊的,因为<代码> init < /C> >可以指<代码> BaseClass:init < /C> >或<代码> BaseClass::它
。使用声明引入额外的
,将把这两个函数都纳入
ChildClass
范围:

class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;

使用基类::init;使用基类::init;
放在
ChildClass
声明的某个地方,您从
ChildClassImpl::init
函数编写的输出告诉我,您不应该拥有这些函数。相反,它们的功能应该放在实际的构造函数中。@SPD:公平地说,这是一个小问题演示这个问题的例子,而不是一个好程序设计的广告。谢谢@ PioTrSkoTwiti。它确实有用。如果你能解释为什么会发生这样的事情,那就更好了。为什么编译器不能找出正确的基类?这是一个弱点,预模板C++的分辨率规则基本上说基本方法是自动的。LLY只在名称上提升/冲突,并且不考虑参数。好处是这允许派生类用另一个签名来屏蔽两种方法。使用手动地促进两种方法使用<代码>允许适当的过载解决方案进入,但是如果您有很多方法来处理此行为,则不是帮助。示例显示了我喜欢的模板用法,但不适合以前的语言,因为这两个基类必须显式命名。感谢@VTT的解析和解释。
#include "stdafx.h"
#include <iostream>
#include "ChildClassImpl.h"

ChildClassImpl::ChildClassImpl(){}

ChildClassImpl::~ChildClassImpl(){}

void ChildClassImpl::init(int* iNumber)
{
    std::cout << "Integer constructor: " << *iNumber << std::endl;
}

void ChildClassImpl::init(float* fNumber)
{
    std::cout << "Float constructor: " << *fNumber << std::endl;
}
#include "stdafx.h"
#include <iostream>
#include "ChildClassImpl.h"

using namespace std;

int main()
{
    ChildClass* childClass = new ChildClassImpl();
    int x = 10;
    childClass->init(&x);
    cout << "Test" << endl;
    getchar();
    return 0;
}
Severity  Code    Description Project File    Line Error
(active)      "BaseClass<T>::init [with T=int]" is
ambiguous ConsoleApplication4 d:\Learning\ConsoleApplication4\ConsoleApplication4\ConsoleApplication4.cpp 14
class ChildClass : public BaseClass<int>, public BaseClass<float>
{
public: using BaseClass<int>::init;
public: using BaseClass<float>::init;
static_cast<BaseClass<int> *>(childClass)->init(&x);