假设我有以下一堆文件:
Generic.h:复杂的模板类
#pragma once
template<typename K, typename V, template<typename Key, typename Value, typename ...> typename C>
struct GenericMap
{
C<K, V> key;
};
Special.h:定义提到的模板类的完全专用版本,简化了易用性。
#pragma once
#include "Generic.h"
#include <string>
#include <map>
typedef GenericMap<std::string, int, std::map> SpecialMap;
Client.h:使用SpecialMap
和定义前向声明的客户端。
#pragma once
class SpecialMap; // Wrong forward declaration
struct Client {
Client();
SpecialMap* map;
};
Client.cpp:客户端代码可能知道Generic.h
并且Special.h
#include "Client.h"
#include "Special.h"
Client::Client()
{
map["343"] = 2;
}
主.cpp:
#include <Client.h>
int main(int argc, char**args) {
Client c;
return 0;
}
GenericMap
表示没有前向声明的模板类。对于某些用户来说,完全专用SpecialMap
的GenericMap
should 版本就足够了,为了方便使用,这里使用了 a typedef
。
现在在Client
内部使用SpecialMap
,但头文件应该只为SpecialMap
.
不幸的是,以下文件将无法编译。不知何故,张贴的前向声明就足够了。什么是正确的?
对于冗长的列表,我很抱歉,但这是我能想到的最小的非工作示例。