在类ctor中的默认nullptr指针给出了无法解析的外部符号c++

Default nullptr pointer in class ctor give unresolved external symbol c++

本文关键字:外部 c++ 符号 ctor 默认 nullptr 指针 在类      更新时间:2023-10-16

我有以下类(非实名):

class CObject1 : public IObject1
{
public:
  CObject1(IObject2 *pIObject2 = nullptr);
}

其中"I"版本用于接口类。现在,当我创建CObject1的实例为:

CObject1 object1;

我得到一个未解析的外部符号,抱怨没有找到CObject1(void)。如果我尝试显式声明另一个actor为:

CObject1()

我显然得到了"指定了多个默认构造函数"的警告,正如人们所期望的那样。

为什么程序找不到我的默认变量??

提前感谢。

编辑:其他说明:

  • 接口本身没有明确定义的actor。
  • 所有这些都在同一个命名空间下。即接口的定义、实现和实例化。
  • 我在MS单元测试中看到了这一点。我没有一个"正常"的项目,我可以测试这个

你的类没有生成一个默认的(CObject1())构造函数。它生成的是一个需要一个实参的构造函数,任何读取定义的代码都知道,如果遇到默认的实参,就填充该实参——这是在调用处完成的。

class C {
public:
  C(int* p = nullptr);
};
C fn() {
  C c{};
  return c;
};

生成
fn():                                 # @fn()
        pushq   %rax
        leaq    (%rsp), %rdi
        xorl    %esi, %esi   ; <<- injects the nullptr
        callq   C::C(int*)   ; <<- note which ctor is called
        popq    %rax
        retq

然而,单元测试框架可能没有看到该定义,并处理您的对象具有默认actor的要求。在这种情况下,您应该考虑这样写:

CObject1() : CObject1(nullptr) {}
CObject1(IObject2 *pIObject2);