提问人:zwhconst 提问时间:8/15/2023 最后编辑:zwhconst 更新时间:8/15/2023 访问量:76
如果我转发声明一个函数模板,我可以将定义放在调用站点之后而不显式实例化它吗?
If I forward declare a function template, may I put the definition after the calling site and not explicit instantiate it at all?
问:
在一个大型项目的头文件中,我必须在调用站点之前转发声明一个函数模板。代码可以归结为:
//H1.h
#pragma once
template <typename>
void f();
inline void g()
{
f<void>();
}
//POI #1
template <typename>
void f()
{}
//TU1.cpp
#include "H1.h"
void func1()
{
g();
}
//(End of TU) POI #2
//TU2.cpp
#include "H1.h"
void func2()
{
g();
}
//(End of TU) POI #3
据我了解,#1、#2 和 #3 是 .在 POI #1 中,尚未定义。在定义 之后,就没有显式的实例化来告诉编译器具体实例化。编译器是否记得在 TU 末尾生成代码?测试结果是肯定的,至少在使用 GCC、clang 或 MSVC 时是这样。f
f
f
f<void>
f<void>
但问题是:函数模板的这种声明-调用-定义模式是否符合标准?
我不是标准的专家,但我搜索了标准文本以查找相关单词,并且仅在使用显式实例化时才找到此规则。但我不确定模板是隐式实例化的情况。
答: 暂无答案
评论