c – 使用类型特征时如何排列文件?
发布时间:2020-12-16 07:06:24 所属栏目:百科 来源:网络整理
导读:我第一次尝试在C中实现traits,但我得到多个定义符号的链接错误. error LNK2005: "public: static class std::unordered_mapstd::string,std::string const ManagerTraitstruct Specialized::Fields"error LNK2005: "public: static class std::unordered_map
我第一次尝试在C中实现traits,但我得到多个定义符号的链接错误.
error LNK2005: "public: static class std::unordered_map<std::string,std::string> const ManagerTrait<struct Specialized>::Fields" error LNK2005: "public: static class std::unordered_map<std::string,std::string> const ManagerTrait<struct Specialized>::Fields" error LNK1169: one or more multiply defined symbols found (我通过删除与std :: unordered_map相关的模板化内容来简化输出,比如std :: allocator,std :: hash等等.) 基本上,有一个Manager类使用特征,默认特征类和一些特殊特征.但是所有专业特征都需要访问嵌套类型的Manager类. manager.h #pragma once class Manager { class Parameter { // ... }; template <typename T> void Usage(T* Instance) { typedef ManagerTrait<T> Trait; // access unordered map for(auto i : Trait::Fields) { /* ... */ } // access function Parameter parameter; Trait::Function(Instance,¶meter); } } // would like to move that in dedicated manager/trait.h template <typename T> struct ManagerTrait; specialized.h #pragma once #include "manager.h" class Specialized { // ... }; // would like to move in a dedicated specialized/trait.h template <> struct ManagerTrait<Specialized> { // define unordered map static const unordered_map<string,string> Fields; // define function static void Function(Specialized *Instance,Manager::Parameter *Parameter) { // ... } }; // populate unordered map const unordered_map<string,string> ManagerTrait<Specialized>::Fields = []{ unordered_map<string,string> fields; // insert some elements // ... return fields; }(); (我删除了命名空间std ::的出现,以使代码更具可读性.) 我如何组织我的代码文件并包括使其工作? 解决方法
不要在标头中定义静态成员.您将在每个TU中引入#includes标头的定义.
改为在一个TU中定义它们;最简单的方法是在.cpp文件中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |