g++将基构造函数错误为字段,并忽略它的参数
g++ mistakes base constructor for field and ignores parameters to it
我有一个基类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,编译器将为您调用默认构造函数。由于它不存在,它失败了。
相关文章:
- 将结构字段的类型展开为可变模板参数
- python.clang AST 解析:获取字段声明的 c++ 模板参数
- 将带有字段的表作为参数从C++传递给 Lua 函数?
- C++中的可变参数函子可以支持命名字段吗?
- 可以将模板字段参考模板参数作为第一个模板参数传递
- 委托构造函数在使用类字段进行参数时会出现分段错误
- 函数从模板参数中获取字段值,而不是直接访问以允许对相同信息使用不同的名称
- 如何初始化结构字段 std::map<std::string, std::string>称为参数
- 在构造函数中初始化const字段,但首先检查一个参数
- 函数作为具有 THAT 函数作为模板参数的类的字段的模板参数
- Qt在主窗口字段中从主窗口获取ui参数
- OpenCV错误:cvGetMat中有错误的标志(参数或结构字段)(无法识别或不支持的数组类型)
- g++将基构造函数错误为字段,并忽略它的参数
- 返回类型取决于静态参数包字段
- std::make_shared 在使用位字段中的参数进行构造时无法编译
- 具有不同模板参数的相同类无法访问彼此的私有字段
- ADO 创建参数在尝试从 C++ 写入 Oracle 的 RAW(16) 字段时失败并出现0x800A0D5D
- 如何将对象字段作为函数参数(特征向量)传递
- 对象数组参数 - 错误:字段“字母”的类型不完整
- 在C++中将默认参数设置为nullptr和非静态类字段