我正在尝试找到一种简单的方法(使用C 11之前,即没有dectype
)来记录模板对类型的哪些要求才能正常工作。也许有更好的方法可以做到这一点。但是,这是我的问题:
#include <iostream>
template <typename T> struct Foo {
static const int test = sizeof(T::size);
};
template <typename T> struct DetectAndError {
DetectAndError() { int test = sizeof(T::size); }
};
struct Bar {};
int main() {
Foo<Bar> x; // NO ERROR ? :/
// std::cout << x.test << std::endl; // ERROR :)
// DetectAndError<Bar> y; // ERROR :)
}
为什么是Foo
error: 'size' is not a member of 'Bar'
另一个答案是有效的,但这里有一些标准:
N4140§14.7.1[温度仪表]/1和2
类模板专门化的隐式实例化会导致声明的隐式实例化,但不会导致类成员函数、成员类、作用域成员枚举、静态数据成员和成员模板的定义、默认参数或异常规范的隐式实例化;它会导致非作用域成员枚举和成员匿名联合定义的隐式实例化。
当在要求成员定义存在的上下文中引用专门化时,会隐式实例化成员的专门化;特别是,静态数据成员的初始化(以及任何相关的副作用)不会发生,除非静态数据成员本身的使用方式要求静态数据成员的定义存在。
因此,test
仅在第一行声明,但在尝试实例化时会产生错误。至于DetectAndError
,您正在隐式调用它的默认构造函数。typedef DetectAndError
这是因为标准要求只有在使用时才会实例化测试。如果不使用模板类的成员变量/成员函数/静态成员,则不会对其进行实例化。
在您的情况下,当您尝试执行x.test时,编译器会尝试查找测试,但随后无法执行,因为缺少x::size。
这种行为几乎被接受和普遍,当然也符合标准。
为什么<code>test
下面的示例类无法编译: 此代码的编译错误消息是: 但是,对于包含以下方法的类,Java不会生成任何错误消息: 关于初始化及其要求,为什么Java对最终实例变量和最终局部变量的处理不同?谢谢
静态变量和实例变量之间的区别是什么。下面这句话是我无法理解的: 在某些情况下,一个类的所有对象只能共享一个特定变量的副本——这里使用静态变量。 静态变量代表类范围的信息。一个类的所有对象共享相同的数据。 我认为实例变量在类范围内使用,而静态变量只在它们自己的方法中有作用域?
我刚刚开始学习Spring Boot。我的代码中有一个错误,上面写着 创建文件[E:\Programming\Java\boot\Project1\target\classes\com\example\demo\alien.class]中定义的名为“alien”的bean时出错:bean实例化失败;嵌套异常是org.springframework.bean。BeanInstationExcepti
问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其
问题内容: 为什么要使用静态块: 过度: 一个相对于另一个的优点/缺点是什么? 问题答案: 仅在必要时才使用静态初始化程序块。例如,有时您需要执行几个步骤来计算字段的最终值。在这种情况下,您有两个机会:编写一个计算值并将字段声明为的方法,或使用初始化程序块: 在这种情况下,我更喜欢使用静态块,因为方法可能会造成混乱(其他开发人员可能会尝试调用它,尽管在初始化期间只能被调用一次)。 实例字段也是如此