C++;11“;“类”;关键词 我最近开始使用C++ 11多一点,并且对类关键字的特殊用法有一些问题。我知道它是用来声明类的,但有两个实例我看不懂: Method<class T>();

C++;11“;“类”;关键词 我最近开始使用C++ 11多一点,并且对类关键字的特殊用法有一些问题。我知道它是用来声明类的,但有两个实例我看不懂: Method<class T>();,c++,C++,为什么在第一个示例中,关键字类在typename之前,而在第二个示例中,关键字对指针有什么作用?这是一个精心设计的类型说明符,通常仅在类名“隐藏”或“隐藏”且需要显式时才需要 class T { }; // for the love of god don't do this T T; T T2; 如果您的编译器是智能的,它将给您以下警告: main.cpp:15:5: error: must use 'class' tag to refer to type 'T' in this scope

为什么在第一个示例中,关键字类在typename之前,而在第二个示例中,关键字对指针有什么作用?

这是一个精心设计的类型说明符,通常仅在类名“隐藏”或“隐藏”且需要显式时才需要

class T
{
};

// for the love of god don't do this
T T;
T T2;
如果您的编译器是智能的,它将给您以下警告:

main.cpp:15:5: error: must use 'class' tag to refer to type 'T' in this scope
    T T2;
    ^
    class 
main.cpp:14:7: note: class 'T' is hidden by a non-type declaration of 'T' here
    T T;
      ^
如果您的类之前没有定义,那么它也将充当转发声明

例如:

template <typename T>
void Method()
{
    using type = typename T::value_type;
}

Method<class T>(); // T is a forward declaration, but we have not defined it yet, 
                   // error.
模板
void方法()
{
使用type=typename T::value\u type;
}
方法();//T是一个向前的声明,但我们还没有定义它,
//错误。
否则就没有必要了

class T
{
public:
    using value_type = int;
};

// method implementation...

Method<T>();
Method<class T>(); // class is redundant here
T类
{
公众:
使用value_type=int;
};
//方法实现。。。
方法();
方法();//课堂在这里是多余的

除了其他答案外,您还可以使用
class
关键字在使用点前向声明一个类。例如,代替:

class SomeClass;
SomeClass* p = some_function();
你可以写:

class SomeClass* p = some_function();
这通常用于模板和标记分派,当实例化模板需要标记类型参数时,该参数的唯一目的是使实例化成为唯一类型,并且标记不必是完整类型。例如:

template<class Tag> struct Node { Node* next; };

struct Some : Node<class Tag1>, Node<class Tag2> {};
模板结构节点{Node*next;};
结构Some:Node,Node{};

@402好回答第一点,指针1的参数是否相同?在第二种情况下,使用class关键字是可选的,通常不鼓励使用。@402第一个和第二个相同。这两种类型都是详细的类型说明符。它们是。@T.C。它们在我提供的示例中是等效的。如果代码块位于类定义中,则不是。@T.C.在类定义中,两种形式都声明
SomeClass
在封闭类的范围内,是吗?否,第一个将
SomeClass
放在封闭类的范围内。第二个将其放入最小的封闭命名空间或块范围中。(即,在第一个类中,
SomeClass
将是嵌套类,而在第二个类中则不会。)
template<class Tag> struct Node { Node* next; };

struct Some : Node<class Tag1>, Node<class Tag2> {};