C++ C++;继承问题

C++ C++;继承问题,c++,inheritance,constructor,C++,Inheritance,Constructor,在文件test.cpp中,我有以下内容: template <typename T> class A { public: A(int a){}; virtual ~A(); private: }; class B : public A<int> { public: B(int a):A(a){}; virtual ~B(); private: }; int main() { return 0; } 模板 甲级 { 公众: A(int A){}

在文件test.cpp中,我有以下内容:

template <typename T>
class A
{
public:
  A(int a){};
  virtual ~A();

private:
};

class B : public A<int>
{
public:
  B(int a):A(a){};
  virtual ~B();

private:
};

int main()
{
  return 0;
}
模板
甲级
{
公众:
A(int A){};
虚拟~A();
私人:
};
B类:公共A
{
公众:
B(inta):a(a){};
虚拟~B();
私人:
};
int main()
{
返回0;
}
当我编译它时,我得到:

jason@jason-linux:~/Documents/ECLibrary$ g++ -g -Wall -Wextra -pedantic-errors test.cpp -o tdriver
test.cpp: In constructor ‘B::B(int)’:
test.cpp:14: error: class ‘B’ does not have any field named ‘A’
test.cpp:14: error: no matching function for call to ‘A<int>::A()’
test.cpp:5: note: candidates are: A<T>::A(int) [with T = int]
test.cpp:3: note:                 A<int>::A(const A<int>&)
jason@jason-linux:~/Documents/ECLibrary$g++-g-Wall-Wextra-pedanticerrors test.cpp-o tdriver
test.cpp:在构造函数“B::B(int)”中:
test.cpp:14:错误:类“B”没有任何名为“A”的字段
test.cpp:14:错误:对“A::A()”的调用没有匹配的函数
test.cpp:5:注:候选者是:A::A(int)[带T=int]
test.cpp:3:note:A::A(常数A&)
我不希望基类有默认构造函数,因为它在我的代码中没有意义。我只想让我的派生类执行基类的被调用构造函数,并为派生类中的额外内容做一些额外的构造。当我试图显式调用一个替代构造函数时,我真的不知道为什么它试图调用基类的默认构造函数。我是不是遗漏了什么


谢谢

您可以将模板参数列表添加到
A

B(int a) : A<int>(a) { } 
B(inta):a(a){

注意,您使用的代码——使用<代码> A < /COD>没有模板参数列表——是有效的C++。COMUO和Visual C++ 2010都接受代码,如:p> g++4.3不接受没有模板参数列表的代码。也许有人可以测试更高版本的g++或检查g++错误数据库,看看这是否是一个已知问题(我不经常使用g++并且不熟悉他们的错误数据库)。

尝试
B(inta):a(a){}

需要阅读:

class B : public A<int>
{
public:
  B(int a):A<int>(a){};
  virtual ~B();

private:
};
B类:公共A类
{
公众:
B(inta):a(a){};
虚拟~B();
私人:
};

它会很好地工作。

您试图将基类初始化为
A
,但您不是从
A
派生的,而是从
A
派生的。我猜您是在尝试对integer进行类A的显式专门化。
Guess应该写成
模板Class A

当然你看到了帖子的样子,因为你需要滚动预览才能提交。阅读编辑常见问题,使用编辑工具栏编辑文章,而不仅仅是猜测。(显然是
[code]
等等。)你把别人正在做的所有修复都搞乱了,每次都完全跳过了预览。就为了这个,我几乎想要-1。你肯定不是这样对待每一项任务的吗?那个单词
template
在那里做什么?无论如何,请按如下方式编辑:将代码放在单独的行上,选择这些行,然后单击“格式为代码”按钮(上面有0和1)。干杯,你应该得到一个-1,因为你没有让人们编辑你的问题,使它看起来像应该的。发布一个问题而不去考虑如何正确设置格式已经够糟糕的了,但是会让其他人帮不上你的忙吗?不,是谁一直把它拆开?这是我第三次修好它。@Jason:没问题;现在你知道了:-)(欢迎来到Stack Overflow)。@Oli:很高兴知道。也许这里有人可以使用更高版本的g++进行测试和/或检查g++bug数据库。恐怕我没有经常使用g++来熟悉它。@Oli:好的,如果我错了,请纠正我,但我认为注入的类名只适用于类是模板或基是依赖的情况。那么,也许这毕竟不是一个g++错误?我可能完全错了…@Armen:不,注入的类名可以“在范围内”使用(C++03 14.6.1/2a,这也给出了在派生类中使用它的示例)模板的注入类名可以与模板参数列表一起使用,也可以不与模板参数列表一起使用,只要
a
是明确的,您可以交替使用
A
A
(如果您是从
A
的两个专业派生出来的,如
B类:A,A{};
,那么
A
B
内部是不明确的,您必须分别使用
A
A
)。