模板类的实例之间是否存在共享的作用域
Is there a scope shared between instances of a template class?
当然除了全局作用域。
我有一个自定义断言类,其中包含一个宏来缓存对__FILE__
的引用:
#define DEFINE_THIS_FILE
static const char THIS_FILE__[] = __FILE__
对于源代码,使用宏没什么大不了的,因为每个源代码都有自己的作用域。然而,模板化的类不能使用源代码,所以我不得不在TemplateClass.h
给出的声明/定义中执行所有ASSERT()调用。如果我在类定义之外使用宏,例如Singleton
DEFINE_THIS_FILE;
namespace NE
{
template<typename T>
class Singleton
{
...
}
}
然后宏在与#包含Singleton
的任何代码相同的范围内结束,并且编译器抛出THIS_FILE__
的重定义错误。(当然,只有当其他代码也使用DEFINE_THIS_FILE
宏时才会发生这种情况。)
如果我把宏放在声明中,编译器不会报错,但链接器将无法为任何给定的模板化类实例找到THIS_FILE__,例如Singleton
:
namespace NE
{
template<typename T>
class Singleton
{
constexpr DEFINE_THIS_FILE; // constexpr modifier required in this case
...
}
}
我假设我得到了链接错误,Undefined symbols for architecture x86_64:
"NE::Singleton<NE::NonTemplateType>::THIS_FILE__"
是由于模板实例不存在于第一次定义THIS_FILE__
的作用域中,Singleton.h
OT:是否有一种方法可以让我的模板类型Singleton
的所有实例共享一个作用域(全局是不可接受的),以便所有实例都可以使用这个静态常量宏?
Edit1
进一步的测试证实:在包含ASSERT()的每个模板化方法中使用宏DEFINE_THIS_FILE
将编译并正确运行....
在这种情况下,实例不共享作用域,而是为每个方法定义了一个static const char THIS_FILE__
。这是有效的,但我怀疑它使用的ROM与std::assert(其隐含的__FILE__
分配)一样多或更多。
我将解决这个问题,直到OT的答案出现:)
Edit2
愚蠢的我。与其使用上面编辑中列出的解决方案,不如创建另一个宏UNCACHED_ASSERT(argsToCheck),直接使用__FILE__
而不是const静态表示。
但是,每个方法有多个断言仍然可以从缓存中受益。
仍然需要OT的答案
您可以将声明放置在未命名的命名空间
#define DEFINE_THIS_FILE namespace { static const char THIS_FILE__[] = __FILE__; }
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 我们可以访问一个不存在的联盟的成员吗
- 为什么我的共享库中存在展开符号
- 如果同时存在共享库和动态库,则链接器将首选哪个库?
- 放置 新 在共享内存中已存在的对象上
- 如何使用共享内存在CUDA中转置巨大的任意矩阵
- 函数 NetShareGetInfo 始终返回 2310(此共享不存在)
- 我可以检查共享内存中是否存在地址
- 为什么存在共享_ptr的原子过载
- 加载具有相同符号的两个共享库时是否存在符号冲突
- 几个使用相同原型的共享对象导致错误:数据库中已经存在文件
- 无法加载/usr/local/lib(Fedora x64)中存在的共享库
- 分析共享库是否存在重复代码链接
- 使用Visual Studio将静态构建的库链接到共享库可能存在内存风险
- 有没有更好的方法来检查boost共享内存段的存在
- 如何从不存在的(在编译时)文件夹链接共享库
- 模板类的实例之间是否存在共享的作用域