编译器错过了无效的构造函数调用,并调用不存在的(或私有的)默认构造函数

Compiler misses invalid constructor call and calls non-existant (or private) default constructor

本文关键字:构造函数 默认 不存在 无效 错过了 函数调用 编译器 调用      更新时间:2023-10-16

我有一个从其他几个基类继承的类的构造函数:

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复制构造函数,而您尚未删除或自己定义该构造函数,因此编译器将很乐意为您生成一个。调试器几乎可以肯定只是没有显示要调用的确切构造函数。