You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

复现Abseil示例用STL实现工厂函数出现链接报错如何解决?

错误根因

该链接错误和替换absl::WrapUnique为std::unique_ptr的操作无关,核心原因是仅声明了Foo的私有默认构造函数,没有提供它的实现。
类定义中的private: Foo();仅为构造函数的声明,仅会告知编译器该函数存在,链接阶段需要找到对应函数的实现符号才能完成编译,缺失这部分实现就会抛出undefined symbol错误。

修复方案

只需要补上Foo()的实现即可,两种常用写法任选其一:

  • 类内直接定义空实现
// foo.h
class Foo {
 public:
  static std::unique_ptr<Foo> Create();
  Foo(const Foo&) = delete;
  Foo& operator=(const Foo&) = delete;
 private:
  // 直接在类内给出空实现,C++11及以上推荐用=default,也可以写Foo() {}
  Foo() = default;
};
  • 在实现文件中补全构造函数
// foo.cc
#include "foo.h"

// 补上构造函数实现,需要自定义初始化逻辑就写在函数体里
Foo::Foo() {}

std::unique_ptr<Foo> Foo::Create() {
    return std::unique_ptr<Foo>(new Foo());
}

补充说明

替换absl::WrapUnique的写法完全符合C标准,C11起std::unique_ptr本身就支持裸指针构造,不需要依赖Abseil库,这部分修改没有问题。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:04