C++;11“;“类”;关键词 我最近开始使用C++ 11多一点,并且对类关键字的特殊用法有一些问题。我知道它是用来声明类的,但有两个实例我看不懂: Method<class T>();
为什么在第一个示例中,关键字类在typename之前,而在第二个示例中,关键字对指针有什么作用?这是一个精心设计的类型说明符,通常仅在类名“隐藏”或“隐藏”且需要显式时才需要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
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> {};