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でない場合はlong long未定義の参照が取得されます。

f<long>はい、なぜとf<long long>が異なる機能であるかには十分な理由があります。それは、標準でlonglong longが異なる型であると述べられているからです。一部のプラットフォームで同じ幅であっても、特に別のプラットフォームでは幅が異なる可能性があるため、問題ではありません。

于 2012-09-17T16:31:06.753 に答える
4

これらは種類が異なるため、異なる方法で処理する必要があります。型のサイズは、オーバーロードやテンプレートの選択には影響しません。

int64_tあなたの問題はlong、あるシステムと他のシステムにある可能性がありますlong long。これは、typedef をオーバーロードまたはテンプレートと組み合わせるときに問題になります。

于 2012-09-17T16:30:58.320 に答える