2017-02-12 11 views
4

私のクラスでは、C++ 98を学習していますので、適切な構文を見つけようとしています。私は実装がそれらの両方のために同じだと思いC++テンプレートクラスの構文

template <class T> 
class A{ 
public: 
    A(); 
    A(const A<T> &rhs); 
    A &operator=(const A<T> &rhs); 
}; 

template <class T> 
class A{ 
public: 
    A(); 
    A(const A &rhs); 
    A &operator=(const A &rhs); 
}; 

それとも、それは次のようにする必要があります:どのようには宣言を書くべき

お互いに違いはありますか?名前A<T>A

template <class T> class A { ... }; 

を考えると

+0

ませんか? – Barmar

+0

@Barmarこの特定の問題では見つかりませんでした。 – Dannz

+1

私はどちらの構文もhttp://stackoverflow.com/questions/7638296/how-to-write-template-class-copy-constructorとhttp://stackoverflow.com/questions/19167201/copy-constructor-テンプレートクラスの – Barmar

答えて

8

は、クラスのスコープ内A<T>を参照するために、両方の有効な名前です。ほとんどの場合、よりシンプルな形式のAを使用することをお勧めしますが、A<T>を使用することができます。

2

R Sahuの答えが正しいですが、私はそれがA以上1つのインスタンス化されたテンプレート引数があり、特にA<T>、同じでない場合を説明するために良いことだと思います。

たとえば、2つのテンプレート引数を持つテンプレート化クラスのコピーコンストラクタを記述する場合、引数の順序が重要なため、オーバーロードのテンプレート化された型を明示的に書き出す必要があります。ここで

は、 "キー/値" 型クラスでの例です:あなたの教科書であっ例は

#include <iostream> 

// Has overloads for same class, different template order 
template <class Key, class Value> 
struct KV_Pair { 
    Key  key; 
    Value value; 

    // Correct order 
    KV_Pair(Key key, Value value) : 
     key(key), 
     value(value) {} 

    // Automatically correcting to correct order 
    KV_Pair(Value value, Key key) : 
     key(key), 
     value(value) {} 

    // Copy constructor from class with right template order 
    KV_Pair(KV_Pair<Value, Key>& vk_pair) : 
     key(vk_pair.value), 
     value(vk_pair.key) {} 

    // Copy constructor from class with "wrong" template order 
    KV_Pair(KV_Pair<Key, Value>& vk_pair) : 
     key(vk_pair.key), 
     value(vk_pair.value) {} 
}; 

template <class Key, class Value> 
std::ostream& operator<<(std::ostream& lhs, KV_Pair<Key, Value>& rhs) { 
    lhs << rhs.key << ' ' << rhs.value; 
    return lhs; 
} 

int main() { 
    // Original order 
    KV_Pair<int, double> kv_pair(1, 3.14); 

    std::cout << kv_pair << std::endl; 

    // Automatically type matches for the reversed order 
    KV_Pair<double, int> reversed_order_pair(kv_pair); 

    std::cout << reversed_order_pair << std::endl; 
} 

See it live on Coliru.

関連する問題