C ++模板类语法

时间:2017-02-12 05:47:22

标签: c++ templates c++98

在我的课堂上,我们正在学习 C ++ 98 ,所以我试图找到合适的语法。

如何撰写声明:

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

或者它应该是这样的:

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

我猜两个实现都是一样的。

它们彼此不同吗?

2 个答案:

答案 0 :(得分:8)

鉴于

D'

名称template <class T> class A { ... }; A<T>都是有效的名称,用于引用类范围内的A。大多数人更喜欢使用更简单的表单A<T>,但您可以使用A

答案 1 :(得分:2)

虽然 R Sahu 的回答是正确的,但我认为说明AA<T>不一样的情况很好,尤其是存在多个实例化模板参数的地方。

例如,当为带有两个模板参数的模板化类编写复制构造函数时,由于参数的顺序很重要,因此需要明确写出重载的模板化类型。

这是一个带有&#34;键/值&#34;的示例。类型类:

#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.