c++模板实例化具现点的问题。

silent2088 2012-08-27 08:34:00

template <typename T>
void f()
{
g();
h();
}

int main()
{
f<int>();
return 0;
}

void g()
{}
void h()
{}

void f();这个函数到底是在哪个位置具现的啊?
...全文
301 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 的回复:]

引用 18 楼 的回复:
引用 14 楼 的回复:

引用 13 楼 的回复:
引用 12 楼 的回复:

引用 11 楼 的回复:
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。

3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。
……
[/Quote]
没有中文版的 c++-template,所以不知道你具体说的那个例子。不过没关系,我把英文版的 chapter 10 全读了。里面最相关的例子就是 10.3.2 的第一个例子,明确说 POI 在 (4),就是 9# 提法中的 3。虽然 c++-templates 在 10.3.2 的末尾一笔带过的说大多数编译器选择在 5,但这不表明标准对 POI 没有规范。楼上的回帖让我觉得 POI 的位置简直是任由编译器自由发挥了,实在是过分解读了标准给与的自由。

对于主楼的例子,标准只允许两个 POI,其一是紧邻 main 定义之后,其二是该文件末尾处。根据 c++-templates,大多数编译器选择在文件末尾处,不过这种选择并非因为紧邻在 main 定义之后见不到 g/h 的定义导致的,更多的是为了能够统一的处理更复杂的情况。

最后,谢谢 7# 和 19# 提及 c++-template chapter 10,又学了点实践知识。
silent2088 2012-08-30
  • 打赏
  • 举报
回复
结贴吧! 遇到了问题再解决吧。
飞天御剑流 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
引用 14 楼 的回复:

引用 13 楼 的回复:
引用 12 楼 的回复:

引用 11 楼 的回复:
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。

3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。

编译器只需要函数声明即可编……
[/Quote]
请参考《C++ template 中文版》第10章第143页的例子。
pengzhixi 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:

引用 11 楼 的回复:
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。

3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。

编译器只需要函数声明即可编译,linker 才需要定义呢,等 linker 进来的时候……
[/Quote]如果真是这样 int main()前面也是合适的。
{
ri_aje 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。

3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。
[/Quote]
编译器只需要函数声明即可编译,linker 才需要定义呢,等 linker 进来的时候,整个 translation unit 都已经完成了,无论在那里都看的见。3 处是最合适的。14.6.4.1/1 明明说的就是 3 处,为什么都视而不见呢?
ri_aje 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

c++标准哪个网址查的啊? 我感觉它是在本作用域最后样的。 还有我最近在看c++模板全览这本书,我发现里面很多东西在vs2008里面实现都有一定的出入。 感觉还是直接英文的算了,没办法。 但不知道c++标准去哪查。
[/Quote]
google c++ committee, follow the first hit to find out standard c++ documents.
ri_aje 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

这个条款仅说明POI的大致范围,但多个POI及不同的位置是允许的,可参考14.6.4.7
[/Quote]
标准说的是 immediately follows,已经很精确了,怎么还是大致范围啊?
14.6.4.7 说的是允许有多个 POI,没有说必须有,我理解这条更多的是允许多次 fun<int>(); 调用能够统一处理,不必无故的受限于 ODR,只要各个 POI 生成相同的定义即可。
但不能因此说 POI 就可以满天飞了,该在那还在那。
ri_aje 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

引用 13 楼 的回复:
引用 12 楼 的回复:

引用 11 楼 的回复:
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。

3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。

编译器只需要函数声明即可编译,linker 才需要定义

如果真是这样 int main()前面也是合适的。
{
……
[/Quote]
你这么说让人啼笑皆非,好像在讨论你想象中的 c++,而非由 c++ 标准定义的 c++。
pengzhixi 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。
[/Quote]
3处是不可能适合的,因为在3处 g(),h()函数的定义还是不可见的。
ri_aje 2012-08-29
  • 打赏
  • 举报
回复
8# 建议“仔细理解”,还是再说的详细一些吧。
根据 14.6.4.1 /1/7 的说法,根据 9# 的提法,只有 3 与 5 是可能的 POI,明显 3 处最合适。
飞天御剑流 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

C/C++ code
template <typename T>
void f()
{
g();
h();
}

int main()
{
//1
f<int>();
//2
return 0;
}
//3
void g()
{}
//4
void h()
{}
//5


就你这里来说1,2,3,4,5都可以作为一个POI点,但是1,2是不合适的,因为c++不允许将f<in……
[/Quote]
对,就楼主所举的例子来说,5处是最合适的。
pengzhixi 2012-08-29
  • 打赏
  • 举报
回复
template <typename T>
void f()
{
g();
h();
}

int main()
{
//1
f<int>();
//2
return 0;
}
//3
void g()
{}
//4
void h()
{}
//5

就你这里来说1,2,3,4,5都可以作为一个POI点,但是1,2是不合适的,因为c++不允许将f<int>()的定义插入到这两处,那么3可不可以作为一个POI点呢,也不行,因为g()和h()的定义在此处不可见,这样唯一合适的点是位置5.
飞天御剑流 2012-08-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 3 楼 的回复:

这个条款仅说明POI的大致范围,但多个POI及不同的位置是允许的,可参考14.6.4.7

标准说的是 immediately follows,已经很精确了,怎么还是大致范围啊?
14.6.4.7 说的是允许有多个 POI,没有说必须有,我理解这条更多的是允许多次 fun<int>(); 调用能够统一处理,不必无故的受限于 ODR,只要各个 POI 生成相同……
[/Quote]
请仔细理解该条款,该条款与immediately那条并不矛盾。
taodm 2012-08-29
  • 打赏
  • 举报
回复
永远不要让自己的代码陷到需要讨论这个问题的窘境
珍惜生命,不要过度玩弄模板。
pengzhixi 2012-08-29
  • 打赏
  • 举报
回复
可以看看c++ template的第10章
silent2088 2012-08-29
  • 打赏
  • 举报
回复

template <class T>
struct A
{
void f()
{
g();
}
};
template <class T>
void h()
{
A<int> a;
sizeof(a);
a.f();
}
int main()
{
h<int>();
return 0;
}
void g()
{
}
大家再看看这个。 讨论讨论。 这个也是能过的。
silent2088 2012-08-29
  • 打赏
  • 举报
回复
if the specialization is not instantiated previous to the instantiation of the
enclosing template, the point of instantiation is immediately before the point of instantiation of the enclosing template。
这里的enclosing template 是指什么意思啊?
Otherwise, the point of instantiation for such a specialization immediately precedes the namespace
scope declaration or definition that refers to the specialization。
the namespace
scope declaration or definition that refers to the specialization。这段谁能试着翻译一下。
silent2088 2012-08-28
  • 打赏
  • 举报
回复
c++标准哪个网址查的啊? 我感觉它是在本作用域最后样的。 还有我最近在看c++模板全览这本书,我发现里面很多东西在vs2008里面实现都有一定的出入。 感觉还是直接英文的算了,没办法。 但不知道c++标准去哪查。
飞天御剑流 2012-08-28
  • 打赏
  • 举报
回复
这个条款仅说明POI的大致范围,但多个POI及不同的位置是允许的,可参考14.6.4.7
ri_aje 2012-08-28
  • 打赏
  • 举报
回复
c++ 11 14.6.4.1/1
For a function template specialization ... the point of instantiation for such a specialization immediately follows the namespace scope declaration or definition that refers to the specialization.

因此 f<int> 的 point of instantiation 在 main 函数定义结束以后。
加载更多回复(1)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧