单独对象的单个模板实例化
Single template instantiation for separate objects
考虑以下内容:
/* T.h */
template <class T>
void Too() {
std::cout << " Template: " << typeid(T).name()
<< " size: " << sizeof(T) << std::endl;
}
/* A.h */
extern void FooA();
/* A.cpp */
struct Local {
int a[2];
}
void FooA() {
Local l;
std::cout << "<Foo A>:n" << " Real: " << typeid(l).name()
<< " size: " << sizeof(l) << std::endl;
Too<Local>();
}
/* B.h */
extern void FooB();
/* B.cpp */
struct Local {
int a[4];
};
void FooB() {
Local l;
std::cout << "<Foo B>:n" << " Real: " << typeid(l).name()
<< " size: " << sizeof(l) << std::endl;
Too<Local>();
}
/* main.cpp */
int main() {
FooA();
FooB();
return 0;
}
编译和运行结果如下:
<Foo A>:
Real: 5Local size: 8
Template: 5Local size: 8
<Foo B>:
Real: 5Local size: 16
Template: 5Local size: 8
这意味着两个模板调用都使用了单个模板实例化。尤其是第一个。虽然可以通过将Too()
定义为
template <class T, size_t s = sizeof(T)> Too();
我想知道是否有更多的通用方法来解决这个问题?因为如果两个调用结构体的大小相同,上面的代码仍然会失败。
编辑:具体来说,我的问题在于,我不能更改文件A和b,所以我可能不会向它们引入匿名命名空间。有模板侧的解决方案吗?因此是第二个模板参数
你的程序违反了ODR(一个定义规则),包含了struct Local
的两个定义。这意味着它是错误的,并且具有未定义行为,所以任何事情都可能发生。
正如已经指出的那样,你违反了一个定义规则。
你可以在匿名命名空间中定义你的局部结构,这样编译器就知道你在谈论不同的局部类型,然后一切都应该"工作":
/* A.cpp */
namespace {
struct Local {
int a[2];
}
}
/* B.cpp */
namespace {
struct Local {
int a[4];
}
}
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 无法使用 SWIG 在 Python 中实例化C++类(获取属性错误)
- 模板化类构造函数的模板实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- C++ 使用单个输入字节文件的不同部分实例化堆栈上的成员类
- 单独对象的单个模板实例化
- 为什么我不能使用单个非类型参数内联模板函数的显式实例化?