una personales pasos para organizar organiza oficina marcar fisico empresa empleados documentos como casa carpetas archivos archivo c++ templates include typetraits

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