基础版本的class
类前面也是可以声明类的指针的,只需要提前声明一个里面这个不认识的标识符是一个类即可。比如这里的`using sd = shared_ptr<class Drc>;`里面的class的作用。
#include <iostream>
#include <memory>
using namespace std;
using sd = shared_ptr<class Drc>;
class Drc{};
// Driver Code
int main()
{
}
上面的class并不是声明类的具体内容,而是标记后面这个不认识的标识符是一个类,类似的作用还有关键词typename。
基础版本的typename
#include <iostream>
#include <memory>
using namespace std;
class Drc
{
public:
using sp = shared_ptr<Drc>;
};
template <typename T>
typename T::sp Create()
{
typename T::sp p { new T() };
return p;
}
// Driver Code
int main()
{
auto x = Create<Drc>();
}
这个Create里面的两个typename的作用也都是标定后面标识符是一个类的。
进阶版本的class
我们有个对外接口叫做set,然后我们内部类也叫set,这个时候我想有个内部对象是set类型的,然后在接口set里面返回它,如果不写class,是区分不出来这个set到底是函数名还是类名字的。
错误例子:
#include <iostream>
#include <memory>
using namespace std;
class claims final {
private:
class has {};
class check {};
class del {};
class get {};
class set {};
public:
class claims::set &set() { return _set; }
class claims::has &has() { return _has; }
class claims::del &del() { return _del; }
class claims::get &get() { return _get; }
class claims::check &check() { return _check; }
private:
set _set;//error here
class get _get;
class has _has;
class del _del;
class check _check;
};
int main()
{
claims m;
m.set();
}
这个时候就不得不说clang++比g++要友好的多得多,我们先看g++的提示:
$ g++ a.cc
a.cc:19:2: error: ‘set’ does not name a type
19 | set _set;
| ^~~
a.cc: In member function ‘claims::set& claims::set()’:
a.cc:13:36: error: ‘_set’ was not declared in this scope; did you mean ‘set’?
13 | class claims::set &set() { return _set; }
| ^~~~
| set
行吧,不知所云
我们再看clang++的提示:
$ clang++ a.cc
a.cc:19:2: error: must use 'class' tag to refer to type 'set' in this scope
set _set;
^
class
a.cc:13:21: note: class 'set' is hidden by a non-type declaration of 'set' here
class claims::set &set() { return _set; }
^
1 error generated.
原来是被同名的函数名字覆盖了定义,这个时候就不得不说clang++比g++要友好的多得多啊,起码给了我思路!!!!
正确的class用法:
#include <iostream>
#include <memory>
using namespace std;
class claims final {
private:
class has {};
class check {};
class del {};
class get {};
class set {};
public:
class claims::set &set() { return _set; }
class claims::has &has() { return _has; }
class claims::del &del() { return _del; }
class claims::get &get() { return _get; }
class claims::check &check() { return _check; }
private:
class set _set;
class get _get;
class has _has;
class del _del;
class check _check;
};
int main()
{
claims m;
m.set();
}