在下面的代码片段中,我在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();
}
答案 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.
};