编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数
Compiler misses invalid constructor call and calls non-existant (or private) default constructor
我有一个从其他几个基类继承的类的构造函数:
Derived::Derived() : MyRpc< Derived, DERIVED_RPC_CLASS_ID, true > ( Derived::sServerName ),
MyEventSource<Derived>( *this ),
Smasher<Derived>( *this )
{
}
正在调用粉碎者的默认构造函数。 同样奇怪的是,如果我将 Smash 的默认构造函数设为私有,或者如果我直接删除它,编译器仍在生成一个公共默认构造函数并调用它。
以下是我如何定义粉碎机:
class SmasherBase
{
SmasherBase()=delete;
SmasherBase( const char *name)
{}
.
.
};
template< typename ... > class Smasher : public SmasherBase
{
Smasher()=delete;
};
template< typename LocalServerRPC_T >
class Smasher<LocalServerRPC_T> : public SmasherBase
{
public:
Smasher()=delete;
Smasher( LocalServerRPC_T &localServer, const char *name ) : SmasherBase( name ),
mLocalServer( localServer )
{
....
}
~Smasher()
{
}
typedef Smasher<LocalServerRPC_T> Smasher_t;
protected:
LocalServerRPC_T &mLocalServer;
};
我希望编译器抱怨我没有调用现有的构造函数,如下所示:
error: no matching function for call to 'Smasher<Derived>::Smasher(EksoCAT&)'
但它很高兴地编译上面的代码,然后在我的反对意见之上创建一个默认构造函数。 它还为基类创建和调用默认构造函数。
我什至尝试将默认构造函数设为私有,希望它至少会意识到它不应该在其位置创建编译器生成的默认构造函数,并且可能会抱怨构造函数是私有的。
没有这样的运气。 代码是愉快地生成的,当我运行时,我可以单步进入幻影默认构造函数。
我正在使用 GNU 4.8.3 C++编译器。 我还清理,重建,搜索这些文件的旧版本,以确保它们没有被使用,等等,等等都无济于事。
谢谢大家的任何帮助和想法。
我的心理调试技能告诉我,你的类Derived
继承自Smasher<Derived>
。在这种情况下,您对Smasher<Derived>(*this)
的调用实际上是在调用Smasher
的复制构造函数,而您尚未删除或自己定义该构造函数,因此编译器将很乐意为您生成一个。调试器几乎可以肯定只是没有显示要调用的确切构造函数。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 初始化具有非默认构造函数的std::数组项的更好方法
- 具有默认模板类型的默认构造函数的类型推导
- 如何使用非默认构造函数实例化模板化类
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 声明没有默认构造函数的字段
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 没有默认构造函数作为模板参数的自定义比较器
- C++17 没有默认构造函数的地图放置(私有默认构造函数)
- 使用移动调用对等构造函数unique_ptr默认构造函数
- C++复制构造函数和默认构造函数
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- 构造函数默认公共和私有变量
- 类模板构造函数默认参数
- 构造函数默认参数
- C++模板构造函数默认参数
- 在c++中设置构造函数默认值
- c++构造函数默认参数
- C++构造函数默认值头文件