Я использую шаблон CRTP для создания интерфейса, из которого будут извлекаться другие классы.CRTP, форвардные декларации и шаблоны в файлах cpp
В интерфейсе I forward объявляет структуру (важно, потому что я не хочу перетаскивать другой материал в интерфейсе), но я включаю его определение в файл cpp, который определяет интерфейс.
Interface.h
#ifndef INTERFACE_H_INCLUDED
#define INTERFACE_H_INCLUDED
// forward declaration
class ForwardDecl;
template <class Derived>
class Interface
{
public:
ForwardDecl interfaceMethod();
};
#endif // INTERFACE_H_INCLUDED
ForwardDecl.h
#ifndef FORWARDDECL_H_INCLUDED
#define FORWARDDECL_H_INCLUDED
struct ForwardDecl
{
ForwardDecl(int i):internal(i)
{}
int internal;
};
#endif // FORWARDDECL_H_INCLUDED
Interface.cpp
#include "Interface.h"
#include "ForwardDecl.h"
template<class Derived>
ForwardDecl Interface<Derived>::interfaceMethod()
{
return static_cast<Derived *>(this)->implementation_func();
}
И это я mplementation, который реализует интерфейс
Implementation.h
#ifndef IMPLEMENTATION_H_INCLUDED
#define IMPLEMENTATION_H_INCLUDED
#include "Interface.h"
class ForwardDecl;
class Implementation: public Interface<Implementation>
{
friend class Interface<Implementation>;
private:
ForwardDecl implementation_func();
};
#endif // IMPLEMENTATION_H_INCLUDED
Implementation.cpp
#include "Implementation.h"
#include "ForwardDecl.h"
#include <iostream>
struct ForwardDecl Implementation::implementation_func()
{
ForwardDecl fd(42);
std::cout << fd.internal << std::endl;
return fd;
}
И главный файл
#include <iostream>
#include "Implementation.h"
#include "ForwardDecl.h"
using namespace std;
int main()
{
Implementation impl;
ForwardDecl fd = impl.interfaceMethod();
cout << fd.internal << endl;
return 0;
}
Я получаю ссылки ошибки s на VS и GCC.
Любое обходное решение? Спасибо.
Возможный дубликат [Почему шаблоны могут быть реализованы только в файле заголовка?] (Http: // stackoverflow.com/questions/495021/why-can-templates-only-be-implement-in-the-header-file) – WhozCraig
Выполнение работы декларации в интерфейсе является основным моментом здесь, если бы не это, я бы переместите все в заголовочный файл. – farnsworth
То, что вы пытаетесь сделать (если я это понимаю, что-то вроде iffy), возможно, возможно с помощью определения * указателя и указателя шаблона *, но такого уровня экземпляра мне нелегко видеть, как он работает. – WhozCraig