模板占位符未在成员的返回类型中定义,仍然可以正常工作
Template placeholder not defined in return type of member, still works fine?
在下面的代码段中,我省略了Assignment运算符(operator=)的返回类型中的模板参数占位符。在我是否指定了模板参数的两种情况下,代码都运行得很好,只是想知道为什么?
感谢
#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.
};
另请参阅:注入的类名不明确不是错误
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程