结合pImpl惯用法与可变参数模板时遭遇链接器错误的求助
结合pImpl惯用法与可变参数模板时遭遇链接器错误的求助
我最近在尝试把**pImpl(指向实现的指针)**惯用法和可变参数模板结合起来,但遇到了一个链接器错误,我怀疑是缺少模板实例化导致的。我的核心需求是保持Foo和Foo::Impl的代码分离,但目前的实现无法通过链接。
下面是我简化后的代码示例:
代码文件
foo.h
#pragma once class Foo { public: Foo(); template <class... Args> int Method(Args&&... args); private: class Impl; Impl* m_Impl; };
foo.cpp
#include <utility> #include "foo.h" #include "impl.h" Foo::Foo() : m_Impl(new Foo::Impl()) { } template <class... Args> int Foo::Method(Args&&... args) { return m_Impl->Method(std::forward<Args>(args)...); }
impl.h
#pragma once #include "foo.h" class Foo::Impl { public: int Method(int argc, char* argv[]); };
impl.cpp
#include <iostream> #include "impl.h" int Foo::Impl::Method(int argc, char* argv[]) { for (int i = 0; i < argc; ++i) std::cout << argv[i] << std::endl; return EXIT_SUCCESS; }
main.cpp
#include "foo.h" int main(int argc, char* argv[]) { Foo foo; return foo.Method(argc, argv); }
错误信息
链接器提示无法找到符号:int Foo::Method<int&, char**&>(int&, char**&)
我尝试过多种方法签名来手动实例化这个缺失的符号,但都没能解决问题。这里面似乎存在一些我没完全理解的细节,想请教各位:如何在保持Foo和Foo::Impl代码分离的前提下,解决这个链接错误?
相关产品推荐
相关产品推荐

