(我很抱歉这个杂乱的标题。我很乐意接受改进它的建议。)
我会尽量做到尽可能简单。我有以下代码:
file1.hpp
template <class val_t>
struct MatOps;
file2.hpp:
#include "file1.hpp"
template <> struct MatOps<float>{
static void method1(){
// Do something
}
static void method2(){
// Do something
}
static void method3(){
// Do something
}
}
File3.hpp:
#include "file1.hpp"
template <> struct MatOps<double>{
static void method1(){
// Do something different
}
static void method2(){
// Do something different
}
static void method3(){
// Do something different
}
}
的main.cpp
#include "file2.hpp"
#include "file3.hpp"
int main(){
float a,b,c,d;
MatOps<float>::method1(a,b,...);
MatOps<float>::method2(c,d,...);
return 0;
}
问题:
MatOps<double>
。但是,MatOps<double>
实际上是否已实例化?或者更粗略地说:file3.hpp的包含是否占用了任何存储空间?MatOps<float>::method3()
,但我正在使用课程中的其他方法。由于我明确地使用MatOps<float>
,编译器是否为MatOps<float>::method3()
生成代码?基本原理:我被要求遵循MISRA C ++:2003标准中的一些指导原则。虽然已经过时,但我还是被鼓励使用那些合理的东西。特别是,有一条规则如下:
头文件应该用于声明对象,函数,内联函数,函数模板,typedef,宏,类和类模板,并且不得包含或生成占用的对象或函数(或函数或对象的片段)的定义存储
头文件被认为是通过
#include
指令包含的任何文件,无论名称或后缀如何。
我的代码非常模板化,因此我可以根据此规则包含任何文件。我的问题来自于我完全专业化(我只做了两个:file2.hpp和file3.hpp中列出的那些)。什么是完整的模板专业化?是否为它们生成了代码,即使它们没有被使用?最终,他们是否占据存储空间?
答案 0 :(得分:1)
要回答您的第一个问题,我引用cppreference.com中的以下内容:
类模板本身不是类型,对象或任何其他类型 实体。不包含仅包含的源文件的代码 模板定义。为了显示任何代码,模板必须 实例化:必须提供模板参数以便 编译器可以从函数生成实际的类(或函数) 模板)。
包含file3.hpp
不会导致代码生成。
关于第二部分,再次来自同一页,
当代码在上下文中引用完全需要的模板时 定义类型,或者当类型的完整性影响代码时, 并且此特定类型尚未明确实例化, 发生隐式实例化。例如,当一个对象 构造类型,但不是指向此类型的指针 构造
这适用于类模板的成员:除非成员是 在程序中使用,它没有实例化,也没有 需要一个定义。
除非您正在对类模板进行显式实例化,否则类模板的各个成员函数将无法实例化,即,编译器将不会为MatOps<float>::method3()
生成代码。< / p>