1

私のコードには次のようなものがあります:

template <typename T>
struct A
{
  void Print();
};

template <>
struct A<char*>
{
  void Print() { printf("Char*!\n"); }
};

template <typename T>
void DoSomething(T& lol)
{
  A<T> a;
  a.Print();
}

int main()
{
  char a[5];
  DoSomething(a);
}

これにより、次のリンカ エラーが生成されます。

error LNK2019: unresolved external symbol "public: void __thiscall A<char [5]>::Print(void)" (?Print@?$A@$$BY04D@@QAEXXZ) referenced in function "void __cdecl DoSomething<char [5]>(char const (&)[5])" (??$DoSomething@$$BY04D@@YAXAAY04$$CBD@Z)

文字の配列で使用できるように、A テンプレートをどの型に特化する必要がありますか? const char*const、char、*、および & の他の組み合わせを試してみましたが、何も機能しません。

機能を変更することはできませんのでご注意くださいDoSomething

また、可能であれば、 のDoSomething<smth>()呼び出しでテンプレートの型を指定せずに、コンパイラに自動的にテンプレートの型を推測 (または変換) してもらいたいと考えていますmain()

4

4 に答える 4

6

aには type がなく、char*typechar[5]があるため、特殊化ではなく、プライマリ テンプレートがインスタンス化されます。

配列からポインタへの変換を手動で実行すると、特殊化が使用されます。

char a[5];
char* aptr = a;
DoSomething(a);

charプライマリ テンプレートを配列に使用したくない場合は、テンプレートを特殊化できます。

template <unsigned N> struct A<char[N]> { /* ... */ };
于 2010-08-07T22:09:25.623 に答える
1

コンパイルエラーに従って、char[5].

template <>
struct A<char*>
{
  void Print() { printf("Char*!\n"); }
};

ただし、提供するのは非常に奇妙な専門分野のようです。

使用する特殊化を明示的に指定したい場合はDoSomething、それを正確に指定しないのはなぜですか?

int main()
{
  char a[5];
  DoSomething<char *>(a);
}

もちろん、DoSomething非 const 参照を取るため、これはまだコンパイルされないことがわかります。そのため、 type の左辺値が必要char *です。

int main()
{
  char a[5];
  char *p = a;
  DoSomething<char *>(p);
}
于 2010-08-07T22:12:59.957 に答える
0
char a[5];
char* aPointer = &a[0];
DoSomething(aPointer);

これにより、char* が DoSomething に渡されます。

これを正しく行うように変更された完全なサンプル コードを次に示します。

template <typename T>
struct A
{
  void Print();
};

template <>
struct A<char*>
{
  void Print() { printf("Char*!\n"); }
};

template <typename T>
void DoSomething(T& lol)
{
  A<T> a;
  a.Print();
}

int main()
{
  char a[5];
  char* aPointer = &a[0];
  DoSomething(aPointer);
}
于 2010-08-07T22:11:12.610 に答える
0

array->pointer の減衰を強制する別の可能性は、次の特殊化を作成することですDoSomething

template <typename T>
void DoSomething(const T& lol)
{
  A<T> a;
  a.Print();
}

template <class T, unsigned N>
void DoSomething(T(& x)[N])
{
  DoSomething(x+0);
}

DoSomething const(配列を渡す場合、非定数参照は参照として機能しないため、のパラメーターを作成する必要があります。

于 2010-08-07T22:23:34.617 に答える