g++将基构造函数错误为字段,并忽略它的参数

g++ mistakes base constructor for field and ignores parameters to it

本文关键字:参数 字段 构造函数 错误 g++      更新时间:2023-10-16

我有一个基类class A<T>和一个派生类class B : public A<string>

class A有一个以整数为唯一参数的构造函数和一个标准的复制构造函数。它没有一个无参数的默认构造函数(不是我定义的;我意识到编译器可能正在创建一个,这可能与我的问题有关)。

class B的构造函数如下所示:

B()
: A(37)
{
}

我得到的错误是:

编译器错误地调用了字段初始化的基本构造函数

fileB.h: In constructor ‘B::B()’:
fileB.h:25: error: class ‘B’ does not have any field named ‘A’

编译器认为正在使用默认(无参数)基类构造函数,并建议使用两个非默认基类构造函数。。。

// Where is it getting this? A() is never written explicitly
fileB.h:25: error: no matching function for call to ‘A<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::A()’
fileA.h:37: note: candidates are: A<T>::A(const A<T>&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]

其中一个应该与所称的相匹配。

// This one matches A(37), right?
fileA.h:24: note:                 A<T>::A(const int&) [with T = std::basic_string<char, std::char_traits<char>, std::allocator<char> >]

我相信这个错误来自于我的编译器的安装或配置方式,因为当我在电脑上编译代码时,我不会得到任何错误,但当我把所有东西都scp到学校的电脑上并在那里编译时,我会得到上面列出的错误。我在这两个地方都使用g++,但显然有些地方有所不同。这种区别是什么?错误是从哪里来的?

不存在从A到int的转换运算符,反之亦然。

我在两个系统上都使用c++03。

这是一个完整的代码样本,它再现了错误(同样,仅在一个系统上):

/*******************************
 * fileA.h
 ******************************/
template <class T>
class A
{
   int member;
  public:
   A(const int & m)
      : member(m)
   {
   }
   A(const A & copyFrom)
   {
      member = copyFrom.member;
   }
};

/*******************************
 * fileB.h
 ******************************/
#include <string>
#include "fileA.h"
using namespace std;
class B : public A<string>
{   
   B()
      : A(37)
   {
   }   
};

首先,A的默认构造函数不是由编译器生成的。如果至少有一个已定义的带有参数的构造函数,则不会生成默认构造函数。

其次,你的问题来自于你没有在B构造函数中指定A的模板参数。你必须写:

B() : A<string>(37) {}

当您编写A(37)时,编译器会查找不存在的非模板类A。

基类总是构造的。由于您没有构造A,编译器将为您调用默认构造函数。由于它不存在,它失败了。