我使用CRTP模式來創建一個接口,其他類將從中獲得。CRTP,前置聲明和模板在cpp文件
在我向前聲明結構(重要,因爲我不想拖在接口其他的東西)的接口,但我包括它在其中定義了接口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 <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-implemented-in-the-header-file) – WhozCraig 2013-04-08 13:32:12
在接口中進行前向聲明工作是這裏的主要觀點,如果它不是我想要的將所有內容移動到頭文件中。 – farnsworth 2013-04-08 13:35:21
你想要做什麼(如果我理解它,哪些是有可能的),可能有模板*接口*定義和指針,但是像這樣的實例級別,我很難看到它的工作。 – WhozCraig 2013-04-08 13:37:27