2

なぜ以下が機能するのか、次のコードのルールが浮かび上がるC++と思いましたODR

typedef char      int8; 
class Sample {
public:
  template <typename T>
  void test( T param){
  }
};

int main() {
  Sample s;
  s.test<char>('a');
  s.test<int8>((int8)'b');
  return 0;
}
4

2 に答える 2

2

テンプレートのインスタンス化が完了し、コンパイラがtypedefと不要なキャストを削除すると、コードは次のようになります。

class Sample {
public:
  void test(char param){
  }
};

int main() {
  Sample s;
  s.test('a');
  s.test('b');
  return 0;
}

typedefあなたは宣言が別の異なるタイプを宣言していると思うようですが、そうではありません。これは単なるエイリアスです(通常、便宜上)。OTOH、異なるテンプレートパラメータを使用して関数テンプレートを呼び出すと、異なるシグニチャを持つ関数が生成されます。どちらの場合もODR違反はありません。

于 2012-05-14T12:21:50.277 に答える
1

どちらも同じことをしています。彼らは違うように見えます。

最初のものはバージョンを使用すると言っているcharので、Tはになりますchar

2つ目は、バージョンを使用することをint8示しているため、Tはになりますint8。これは実際には単なるchar変装です。したがって、Tは引き続き文字であり、どちらの場合も文字を渡すので、すべて問題ありません。

于 2012-05-14T12:16:35.247 に答える