复现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
相关产品推荐
相关产品推荐

