처음 C++에서 특성을 구현하려고 시도했지만 여러 정의 된 심볼에 대한 링크 오류가 발생했습니다. 형질을 사용할 때 파일을 정렬하는 방법은 무엇입니까?
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 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 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::allocator
,
std::hash
등처럼
std::unordered_map
관련 템플릿 물건을 제거하여 출력을 단순화.)
기본적으로 특성을 사용하는 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::
의 차례 나오는 제거.)
어떻게 할 내 코드 파일을 구성해야하고 작동하도록하려면 include가 필요합니까?
연결 오류를 제공하십시오. – Manu343726
포인터 대신 참조를 사용하십시오. – Manu343726
@ Manu343726 링커 오류를 추가했습니다. 또한 예제와 관련된 std :: unordered_map 특성을 예제 소스 코드에 추가했습니다. – danijar