c++ - personales - como se organiza un archivo
¿Cómo organizar archivos cuando se usan rasgos de tipo? (1)
No defina miembros estáticos en un encabezado. Introducirá la definición en cada TU que #include
el encabezado.
Definirlos en una TU en su lugar; la forma más fácil de hacerlo es en un archivo .cpp .
Traté de implementar rasgos en C ++ la primera vez, pero recibo errores de enlace para varios símbolos definidos.
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
(Simplifiqué la salida eliminando elementos relacionados con std::unordered_map
como std::allocator
, std::hash
, etc.)
Básicamente, hay una clase Manager
que usa los rasgos, una clase de rasgo predeterminada y algunos rasgos especializados. Pero todos los rasgos especializados necesitan acceso a un tipo anidado de la clase 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;
especializado.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;
}();
(Eliminé las ocurrencias del espacio de nombres std::
para hacer que el código sea más legible).
¿Cómo debo organizar mis archivos de código e incluirlos para que funcione?