1

考虑以下代码:

#include <iostream>
#include <cinttypes>  

template<class T>
void f();

template<>
inline void f<long long>() {
  std::cout<<"f<long long>()"<<std::endl;
}

int main(int , char** ) {
  std::cout<<"sizeof(long)="<<sizeof(long)<<std::endl;
  std::cout<<"sizeof(long long)="<<sizeof(long long)<<std::endl;
  f<int64_t>();
  return 0;
}

32 位 G++ 4.6.3 编译成功并产生输出:

sizeof(long)=4
sizeof(long long)=8
f<long long>()

但是,在 64 位 G++ 4.6.3 下编译会产生链接器错误:

undefined reference to `void f<long>()'
ld returned 1 exit status

即使使用f<int64_t>()注释掉的行编译和运行会产生:

sizeof(long)=8
sizeof(long long)=8

是否有充分的理由为什么 64 位 G++ 将f<long>f<long long>视为不同的函数,即使longlong long大小相同,或者这是我应该报告的错误?

4

2 回答 2

7

的基础类型int64_t可以是任何满足要求的东西。long在一个平台和另一个平台上制作它是可以的long long

由于您提供了一个专业化long long并且通用版本没有主体,如果int64_t不是 along long您将获得未定义的引用。

是的,有一个很好的理由为什么f<long>f<long long>是不同的功能:这是因为标准这么说long并且long long是不同的类型。它们在某些平台上恰好具有相同宽度的事实并不重要,特别是因为它们在另一个平台上可能具有不同的宽度。

于 2012-09-17T16:31:06.753 回答
4

它们是不同的类型,因此必须区别对待。类型的大小不影响重载或模板选择。

您的问题可能int64_tlong在一个系统long long上和另一个系统上。在将 typedef 与重载或模板结合使用时,这是一个问题。

于 2012-09-17T16:30:58.320 回答