加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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,&parameter);
    }
}

// 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文件中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读