1

次のクラスとテンプレート関数があります。

template <size_t num>
class String{
 public:
  char charArray[num];
};

template <size_t num,typename T>
void getString(String<num> & string,T number){
 cout <<string.charArray<<' '<<number<<'\n';
}

次に、次のように明示的なインスタンス化を実行して、そのインスタンス化をDLLにエクスポートしようとしましたが、リンカーによって未解決の外部シンボルのリンカーエラーが発生したため、最終的にインスタンス化されなかったことがわかりました。その関数をインポートして使用します(正確なリンカーエラー:"未解決の外部シンボル"__declspec(dllimport)void _ cdecl getString <5>(class String <5>&、unsigned char)( _imp _ ?? $ getString @ $ 04 @@ YAXAAV?$ String @ $ 04 @@ E @ Z) ")インスタンス化しようとした時点で" num "が指定されていなかったため、最初はString<num> & string、ポインタとして実装されるため、次の構文になると考えていました。インスタンス化ですが、私は間違っていたようです。

template<size_t num> 
__declspec(dllexport) void getString(String<num> & string,unsigned char number);

さて、私は地球上で見つかったすべての整数に対してインスタンス化を行うつもりはないので、インスタンス化を行うべきだとどのように提案しますか!!!。

4

3 に答える 3

4

任意のパラメーターをインスタンス化できるようにしたい関数テンプレートの場合は、ソースファイルに入れないでください。代わりにヘッダーファイルに入れてください。

必須のリンク:

于 2010-11-09T08:47:10.617 に答える
1

それは、最初から間違った設計です。私が行ったことは、明示的なインスタンス化ではありません。「size_t num」の値が異なる場合でも、最初に考えていたのとは逆に、関数の異なるインスタンスが生成されるためです。私の意図した明示的なインスタンス化は、この設計では不可能です。適切な設計のために、関数の最初のパラメーターは、「typename T」のさまざまな型の明示的なインスタンス化を可能にする配列にする必要があります。正しい設計は次のようになります。

template <typename T>
void getString(char string[],T number){
 cout <<string<<' '<<number<<'\n';
}
template __declspec(dllexport) void getString(char string[],unsigned char number);
于 2010-11-09T13:33:51.507 に答える
0

ヘッダーで次のように宣言します。

template <size_t num,typename T>
void getString(String<num> & string,T number);

あなたのcppファイルで定義:

template <>
void getString<42,int>(String<42,int> & string, int number){
  cout <<string.charArray<<' '<<number<<'\n';
}
于 2010-11-09T09:04:08.703 に答える