2011-07-26 13 views
1

私はC++クラステンプレートの問題を調査しています。 1つのクラステンプレートは特殊ですが、コンパイラーは常に特殊化の使用を選択するとは限りません。私は、コンストラクタの引数は、(問題が簡単な引数では発生しません)かなり複雑であるため、問題を示すサンプルを作成するために管理していないテンプレートクラスの特殊化はコンストラクタ引数に依存しますか?

temlate <class T> 
class MyClass { /*some constructors*/ }; 

template<> 
class MyClass <int> 
{ void foo(); /*some constructors*/} 

MyClass<int> test1; 
test1.foo(); //works 

MyClass<int> test1("hallo"); 
test1.foo(); //doesn't work (foo does not exist, compiler uses unspecialized version.) 

:私は、コンストラクタの引数は、この影響を与えるように見えることがわかりました。

私の質問は単純に:これは、コンストラクタの引数がコンパイラの選択に影響する可能性はありますか?どうやって?

私は、Visual C++で2008年

おかげでたくさん働いています

---- EDIT:テンプレートの特殊化は、我々が構築する静的ライブラリ内のすべての翻訳単位の一部ではなかった場合は、問題が発生し、:

我々は問題を特定しているように思えます。しかし、他の翻訳単位がなければ、それは消えます。

私はhttp://codeidol.com/cpp/cpp-templates/Instantiation/Implementation-Schemes/を見つけました。欲張りな実装では、私たちが観察した現象を説明することができます。

MSVCとGCCが実際にどの実装体系を使用しているかは誰にも分かりますか?

+1

完全なテストケースを表示してください。 –

+0

「うまくいかない」とはどういう意味ですか? –

+2

@ Philipp: コンストラクタの引数が の特殊化の選択に影響することは考えにくいです。エラーメッセージを投稿できますか? 私は今考えることができるのは、変数定義が、 構文解析のために 'MyClass 'を返す関数宣言のように解析されているということです。 –

答えて

2

私の質問は単純です:それは可能ですか、そのコンストラクタ 引数は、コンパイラの選択に影響を与えますか?どうやって?

いいえ、あなたが使用したい入力したことを言っているので:

MyClass<int> test1; 
test1.foo(); //works 

は、常に専門的なタイプのオブジェクトを作成しています。

1

グローバルテンプレート関数は型になり、コンパイラは関数の引数を型減算に使用します。同様に、classテンプレートの "type"引数は、クラスのテンプレート引数として使用されます。

しかし、あなたは(いくつかのタイプ一部ある)コンストラクタは、テンプレート型の控除に参加することにしたい - ことはできません。

関連する問題