【发布时间】:2016-11-29 01:38:35
【问题描述】:
我正在遵循here 中的示例,但是我正在使用模板并调用其中一个派生类的构造函数。以下代码可以在没有模板的情况下使用,但包含时我不确定为什么会出现以下错误:
: error: no matching function for call to ‘AbsInit<double>::AbsInit()’
NotAbsTotal(int x) : AbsInit(x) {};
^
代码如下:
#include <iostream>
using namespace std;
template<typename T>
class AbsBase
{
virtual void init() = 0;
virtual void work() = 0;
};
template<typename T>
class AbsInit : public virtual AbsBase<T>
{
public:
int n;
AbsInit(int x)
{
n = x;
}
void init() { }
};
template<typename T>
class AbsWork : public virtual AbsBase<T>
{
void work() { }
};
template<typename T>
class NotAbsTotal : public AbsInit<T>, public AbsWork<T>
{
public:
T y;
NotAbsTotal(int x) : AbsInit(x) {};
}; // Nothing, both should be defined
int main() {
NotAbsTotal<double> foo(10);
cout << foo.n << endl;
}
【问题讨论】:
-
@TavianBarnes 哈哈谢谢!请回答
-
这应该可以。但也许我的欺骗是错误的,因为它应该在 GCC 4.5 中得到修复,它大大早于 C++14。你的编译器和版本是什么?
-
和编译命令。
-
AbsInit<T>是一个依赖基类。AbsInit是AbsInit<T>本身范围内的注入类名,但由于AbsInit<T>的范围没有被检查,所以在名称查找的第一阶段可以找到的唯一AbsInit是一个类模板名(在搜索全局范围时),而不是引用AbsInit<T>的某些特定实例化的类型 -
@PiotrSkotnicki:
C++11: 14.6.1/3在一个例子中似乎是相反的。很遗憾您在重新打开之前没有真正阅读潜在的欺骗!