我有两个文件test.h和main.cpp,如下所示:
test.h
#include <memory>
class TestImpl;
template <typename... T>
void createConnection(T&&... Args)
{
// 1. Why is this working if the constructor is in cpp?
std::unique_ptr<TestImpl> pimpl(new TestImpl(std::forward<T>(Args)...));
std::cout << "Done..." << std::endl;
// 2. Why is this not working if the constructor call has no issues?
pimpl->sayHello();
}
main.cpp
#include <iostream>
#include "test.h"
class TestImpl
{
public:
TestImpl(const std::string& first, const std::string& second)
: _first(first)
, _second(second)
{
}
void sayHello()
{
std::cout << "Hello ... " << std::endl;
}
private:
std::string _first;
std::string _second;
};
int main()
{
std::cout << "Hello World!" << std::endl;
createConnection("ABC", "DEF");
return 0;
}
从评论中可以明显看出,我的主要问题是为什么构造函数调用没有报错“无效使用不完整类型'class TestImpl'...”。参考资料是我使用的GCC 5.2,没有特定的标志。
TestImpl
的完整定义。 - Marek RsayHello
方法中无效 - 这正是问题所在的意外行为。@n.m. 也是如此。 - V0ldek