【发布时间】:2015-07-03 18:54:48
【问题描述】:
考虑以下代码:
模板.h
template<typename T>
class templ{
public:
virtual const int virtualMethod(const T *const) const = 0;
}
Base.h
#include "template.h"
class Der1;
class Der2;
class Base :
public templ<Base>,
public templ<Der1>,
public templ<Der2>{
public:
virtual ~Base(){}
};
Der1.h
#include "Base.h"
class Der1 : public Base {
public:
virtual const int virtualMethod(const Base *const) const override;
virtual const int virtualMethod(const Der1 *const) const override;
virtual const int virtualMethod(const Der2 *const) const override;
};
Der1.cpp
#include "Der1.h"
const int Der1::virtualMethod(const Base *const sth) const{
return sth->templ<Der1>::virtualMethod(this);//does not work
//how to fix it?
}
const int Der1::virtualMethod(const Der1 *const sth) const{
//do sth
}
const int Der1::virtualMethod(const Der2 *const sth) const{
//do sth
}
Der2 类也继承自 Base 并实现了这三个功能。
对于这个代码编译器给了我这些信息:
- 'templ' is ambiguous ' 候选者是:templ() templ(const 模板 &) 模板 () 模板 (常量模板 &) 模板 () templ(const templ &) '
- 无法解析函数“virtualMethod”
- 命名空间成员函数“virtualMethod”无法解析。
- 类型“Der1”无法解析。
- 未定义的引用 `templ::virtualMethod(Der1 const*) const'
一般来说,代码的想法是实现双类型分派。虽然我认为我知道是什么导致了问题,但我不知道如何解决它。所以也许你可以帮助我。
【问题讨论】:
-
您可能希望使用CRTP 而不是嵌入式抽象基类。
-
请不要混合使用静态多态(模板)和动态多态(虚拟),除非您知道自己在做什么。
-
另外,在定义接口时,应该使用虚拟继承(避免多个基类)
-
你能发一个minimal, complete, and verifiable example吗?您的代码可以按原样编译,除非您缺少包含或其他内容。
标签: c++ templates multiple-inheritance