繁体   English   中英

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

[英]Template placeholder not defined in return type of member, still works fine?

在以下代码段中,我在Assignment运算符的返回类型(operator =)中省略了模板参数占位符。 在我没有指定template参数的两种情况下,代码都运行良好,只是想知道为什么?

谢谢

#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();
}

根据标准[n3690:14.6.1 / 1]:

像普通(非模板)类一样,类模板也具有注入的类名(第9条)。 注入的类名可以用作模板名或类型名。 当它与模板参数列表一起使用时,作为模板模板参数的模板参数或作为朋友类模板声明的详细类型说明符中的最终标识符时,它指的是类模板本身。 否则,它等效于模板名称,后跟<>中包含的类模板的模板参数。

这称为注入类名。 在模板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.
};

另请参见: 注入的类名不明确不是错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM