1

テンプレートパラメータを持つクラスのすべてのメソッド宣言は、そのパラメータで宣言する必要がありますか?コンパイラは次のようなものを望んでいるようです

// Queue.h
template <class ItemType>
class Queue
{
    Queue();
    ItemType dequeue();
    int count();
    /* ... other methods ... */
};
// Queue.cpp
template <class ItemType>
Queue<ItemType>::Queue()
{ /*...*/ }
template <class ItemType>
int Queue<ItemType>::count()
{/*...*/}
template <class ItemType>
ItemType Queue<ItemType>::dequeue()
{/* ... */}

Java / C#から来ているので、これは少し冗長に思えます-私は次のようにメソッドをもっと定義できるはずだと思います:

int Queue::count() 

署名はItemTypeを参照しないため、省略できます。

Queue::ItemType Queue::dequeue() 

署名はItemTypeを参照しますが、識別子を次のように修飾するため、コンパイラはテンプレートパラメータについて話していることを認識しています。Queue::

4

3 に答える 3

5

はい、テンプレート引数を指定する必要があります。冗長に見えるかもしれませんが、そうではないことに注意してください。C ++テンプレートは、Javaジェネリックよりもはるかに強力なツールであり、特殊化が可能です。つまり、ベーステンプレートQueueでは、異なるテンプレート引数に一致し、異なる定義を持つ複数の実装が存在する可能性があります。Queueまたは、一部の機能に複数の専門分野を持つ単一のテンプレートを作成することもできます。templateこれらの2つの状況では、引数リストとクラステンプレート引数の両方を指定する必要があります。

// Just member specialization
template <typename T>
struct X {
   void foo() { std::cout << "generic\n"; }
};
// specialize just this member for `int`
template <>
void X<int>::foo() { std::cout << "int\n"; }
int main() {
   X<double> xd; xd.foo();  // generic
   X<int>    xi; xi.foo();  // int
}

// Class template specialization
template <typename T>
struct X {
   void foo();
}
template <typename T>
struct X<T*> {
   void bar();
}
template <typename T>
void X<T>::foo() { std::cout << "generic\n"; }
template <typename T>
void X<T*>::bar() { std::cout << "ptr\n"; }
int main() {
   X<int > xi; xi.foo();       // generic
   X<int*> xp; xp.bar();       // ptr
}
于 2012-09-09T14:33:04.677 に答える
2

はい、そうですQueue。テンプレートパラメータのないタイプではないため、冗長ではありません。ただし、クラステンプレート宣言内に関数定義を指定できます。

template <class ItemType>
class Queue
{
    Queue();
    ItemType dequeue() { /* implementation */}
    int count() { /* implementation */ }
    /* ... other methods ... */
};

これを覚えておいてください

Queue<int> q;
int i = q.dequeue();

と同等です

Queue<int> q;
int i = Queue<int>::dequeue(&q);

つまり、関数自体がテンプレートパラメータを参照していない場合でも、関数名を修飾するには完全な型が必要です(ただし、この場合、戻り型にはテンプレートパラメータが必要です)。

于 2012-09-09T14:19:21.873 に答える
1

はい。

クラステンプレートのメンバー関数、メンバークラス、メンバー列挙、静的データメンバー、またはメンバーテンプレートがクラステンプレート定義の外部で定義されている場合、メンバー定義は、テンプレートパラメータが次のようなテンプレート定義として定義されます。クラステンプレートのもの。メンバーの定義で使用されるテンプレートパラメーターの名前は、クラステンプレート定義で使用されるテンプレートパラメーター名とは異なる場合があります。

于 2012-09-09T14:20:09.243 に答える