模板占位符未在成员的返回类型中定义,仍然可以正常工作?

时间:2014-10-27 15:31:42

标签: c++ c++11

在下面的代码片段中,我在Assignment运算符的返回类型(operator =)中省略了模板param占位符。在我指定了模板参数的情况下,代码运行正常,只是想知道为什么?

由于

#include <iostream>
using std::cout; using std::endl;

class Ref
{
    int _ref_counter;

public:
    Ref() : _ref_counter(0)     {}
    void upRef() { _ref_counter++; }

    int downRef() { return --_ref_counter; }
};

template <typename T1> class SmartPointer
{
    T1* _ptr;
    Ref *_ref;

public:
    SmartPointer() : _ptr(0)
    {
        _ref = new Ref();
        _ref->upRef();
    }

    SmartPointer(T1* ptr): _ptr(ptr)
    {
        _ref = new Ref();
        _ref->upRef();
    }

    SmartPointer(const SmartPointer &sp): _ptr(sp._ptr), _ref(sp._ref)
    {
    {
        _ref->upRef();
    }

//      SmartPointer<T1>& operator= (const SmartPointer &sp)
    SmartPointer& operator= (const SmartPointer &sp)
    {
        //Always check self assignment
        if(this != &sp)
        {
            //Lose the existing smartpointer info
            if(0 == _ref->downRef())
            {
                delete _ptr;
                delete _ref;
            }

            _ptr = sp._ptr;
            _ref = sp._ref;
            _ref->upRef();
        }
        return *this;
    }

    ~SmartPointer()
    {
        if(0 == _ref->downRef())
        {
            delete _ptr;
            delete _ref;
        }
    }

    T1& operator* () { return *_ptr; }

    T1* operator-> () { return _ptr; }
};

class Lock
{
public:
    void somefuntion()
    {
        cout << "somefunction called ! " << endl;
    }

    ~Lock()
    {
        cout << "Destructor Lock called !" << endl;
    }
};

int main()
{
    SmartPointer<Lock> pMemLock(new Lock());

    pMemLock->somefuntion();
    {
        SmartPointer<Lock> pMemLock1(pMemLock);
    }

    SmartPointer<Lock> pMemLock2;
    pMemLock2 = pMemLock;
    pMemLock2->somefuntion();
}

2 个答案:

答案 0 :(得分:3)

来自标准[n3690:14.6.1 / 1]:

  

与普通(非模板)类一样,类模板也有   注入类名(第9条)。注入的类名可以用作   模板名称或类型名称。与它一起使用时   template-argument-list,作为模板的模板参数   template-parameter,或者作为elaborated-type中的最终标识符   朋友类模板声明的说明符,它指的是   类模板本身。否则,它相当于   template-name后跟类的模板参数   括在&lt;&gt;。

中的模板

答案 1 :(得分:2)

这称为注入类名。在模板X<T>中,名称X相当于X<T>。这是一个有趣的例子:

template<template<class T> class X>
class Y
{
};

template<class T>
class X;
{
    Y<X> mem; //won't compile, because X is not a template, but is equivalent to X<T>, which is a type.
};

另请参阅:Ambiguous injected class name is not an error