【发布时间】:2019-11-10 13:26:05
【问题描述】:
(>= c++14)
我目前正在使用命名空间 World 作为(某种)静态类。 这是错误的一个小(和愚蠢)示例:
world.hpp
#pragma once
namespace World {
namespace {
template<typename T>
std::vector<T> components ;
}
template<typename T>
T get(int i) {
return components<T>[i] ;
}
template<typename T>
void add (T elm) {
components<T>.push_back(elm) ;
}
}
layer.hpp
#pragma once
class Layer {
public:
float get(int i) ;
void add(float elm) ;
} ;
layer.cpp
#include "layer.hpp"
#include "world.hpp"
float Layer::get(int i) { return World::get<float>(i) ; }
void Layer::add(float elm) { World::add<float>(elm) ; }
main.cpp
#include "world.hpp"
#include "layer.hpp"
#include <iostream>
int main() {
Layer layer ;
for (int i=0 ; i<5 ; ++i) {
World::add<int>(i) ;
layer.add(i/5.f) ;
}
for (int i=0 ; i<5 ; ++i) {
std::cout << "get<int>:" << World::get<int>(i) << std::endl ;
std::cout << "Layer::get:" << layer.get(i) << std::endl ;
std::cout << "get<float>:" << World::get<float>(i) << std::endl ; // <-- ! SEGFAULT
}
return 0 ;
}
我知道每次我的 world.hpp 文件被包含在 .cpp 中时,它都会创建一个新变量 components 所以当我调用 layer.get 和 World::get 它不会访问相同的向量(尽管这是我想要的)。我想这与 static 或 external 链接(或者我错了吗?)有关,但我完全不知道如何处理它。我错过了什么?
[编辑] 我想要的是向量 components 是唯一的,所以每个包含“world.hpp”的文件都指的是完全相同的向量。
【问题讨论】:
-
每次包含
world.hpp时,它都会创建一个嵌套在namespace World内的新 未命名命名空间,这可能不是您想要的。 -
你能解释一下你的意思是“如何处理它”。如果您不希望每个翻译单元在此处使用匿名命名空间,请不要使用匿名命名空间。
-
@RichardCritten 确实,但由于我有模板函数,我无法将未命名的命名空间移动到 .cpp 文件。 SamVarshavchik 我试着让我的目标更清晰一些。
-
为什么会有匿名命名空间?
-
@RichardCritten 从外部隐藏变量,但由于它会引起很多问题,我想如果没有其他解决方案,我会删除它
标签: c++ templates namespaces