なぜ以下が機能するのか、次のコードのルールが浮かび上がる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;
}
なぜ以下が機能するのか、次のコードのルールが浮かび上がる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;
}
テンプレートのインスタンス化が完了し、コンパイラがtypedefと不要なキャストを削除すると、コードは次のようになります。
class Sample {
public:
void test(char param){
}
};
int main() {
Sample s;
s.test('a');
s.test('b');
return 0;
}
typedef
あなたは宣言が別の異なるタイプを宣言していると思うようですが、そうではありません。これは単なるエイリアスです(通常、便宜上)。OTOH、異なるテンプレートパラメータを使用して関数テンプレートを呼び出すと、異なるシグニチャを持つ関数が生成されます。どちらの場合もODR違反はありません。
どちらも同じことをしています。彼らは違うように見えます。
最初のものはバージョンを使用すると言っているchar
ので、Tはになりますchar
。
2つ目は、バージョンを使用することをint8
示しているため、Tはになりますint8
。これは実際には単なるchar
変装です。したがって、Tは引き続き文字であり、どちらの場合も文字を渡すので、すべて問題ありません。