如何编译期标记一个标识符是一个类

基础版本的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();

}

猜你喜欢

转载自blog.csdn.net/qq_33882435/article/details/127789896
今日推荐