У меня есть два файла 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;
}
Как видно из комментариев, главный вопрос заключается в том, почему вызов конструктора не дает ошибку "Недопустимое использование неполного типа" класса TestImpl "...". Для справки я использую GCC 5.2 без каких-либо конкретных флагов.