访问WINDOW_AUTOSIZE必须是cv命名空间(cv::WINDOW_AUTOSIZE),而CV_LOAD_IMAGE_GRAYSCALE是全局性的(::CV_LOAD_IMAGE_GRAYSCALE),感觉很别扭,为什么::CV_LOAD_IMAGE_GRAYSCALE是全局性的而::WINDOW_AUTOSIZE是属于命名空间cv,直接右键“转到定义”得到以下结果: namespace cv {
enum { // Flags for namedWindow WINDOW_NORMAL= CV_WINDOW_NORMAL,// the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size WINDOW_AUTOSIZE = CV_WINDOW_AUTOSIZE, // the user cannot resize the window, the size is constrainted by the image displayed WINDOW_OPENGL= CV_WINDOW_OPENGL,// window with opengl support
// Flags for set / getWindowProperty WND_PROP_FULLSCREEN= CV_WND_PROP_FULLSCREEN,// fullscreen property WND_PROP_AUTOSIZE= CV_WND_PROP_AUTOSIZE,// autosize property WND_PROP_ASPECT_RATIO = CV_WND_PROP_ASPECTRATIO, // window's aspect ration WND_PROP_OPENGL= CV_WND_PROP_OPENGL// opengl support };
enum { /* 8bit, color or not */ CV_LOAD_IMAGE_UNCHANGED=-1, /* 8bit, gray */ CV_LOAD_IMAGE_GRAYSCALE=0, /* ?, color */ CV_LOAD_IMAGE_COLOR=1, /* any depth, ? */ CV_LOAD_IMAGE_ANYDEPTH=2, /* ?, any color */ CV_LOAD_IMAGE_ANYCOLOR=4 };
这里就比较清晰了,两个都在头文件里,但::WINDOW_AUTOSIZE在命名空间cv中定义,所以::WINDOW_AUTOSIZE只能通过命名空间cv访问,另外虽然
::WINDOW_AUTOSIZE属于opencv这个第三方库,但是本程序包含了相应的头文件,所以可以通过::全局访问,
总结一下 1.::可以访问全局变量(全局作用域) 2.::可以在using namespace 之后直接访问相应命名空间的类,或者在没有using的情况下通过命名空间:: 来访问相应的类(命名空间) 3.::用来访问类函数(主要区别于对象的成员函数访问方法的“.”)(类静态成员)
另外遇见
CWnd::MessageBox(_T("测试!"))不要以为CWnd是命名空间,又第2、3可知,CWnd可能是类(MessageBox是静态函数)或者命名空间。
最后::可以用作提示作用,即直接::或者命名空间::或者类::(全局作用域、命名空间、类静态成员)