首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

编译期用代码检测类的某个成员函数是否存在+你绝对没有见过的奇怪有关问题

2012-03-15 
编译期用代码检测类的某个成员函数是否存在+你绝对没有见过的奇怪问题.以下代码我用来检测某个类是否有某

编译期用代码检测类的某个成员函数是否存在+你绝对没有见过的奇怪问题.
以下代码我用来检测某个类是否有某个方法的,如果工作正常,是大有用处的。
        注意这些代码并不需要用到windows的windows.h和c++的string,所以没有必要包含
                #include   <windows.h>
                #include   <string>

        这两行。于是我试着先去掉 #include   <windows.h>   ,程序运行竟然不正常了!于是我又加上#include   <windows.h> ,程序又恢复正常。我又试着去掉#include   <string> ,程序又工作不正常了。然后我两个全部去掉,程序又工作正常。

  于是我发现规律:要么两个全部包含,要么两个全部不包含,程序则工作正常。
如果只包含其中一个,那么程序工作不正常。

  这是我见过的最奇怪的问题,因为,正常地来说,不管怎么样的代码,与两个毫不相关的头文件,去掉或者加上某个头文件没有什么关系吧。请各位C++同志发表一下意见,这是怎么回事,怎么解决这个问题。

  以下是程序全部代码。

#include   <iostream>
#include   <Windows.h>
#include   <string>

struct   NullStruct;

typedef   char   TOne;
struct   TTwo{   char   x[2];   };

template <int   m>
struct   Param
{};

struct   TestCls
{
void   MemFun(   Param <1>   ){}
void   MemFun(   Param <2>   ){}
void   MemFun(   Param <3>   ){}
};

template <int   m,class   T,void   (T::*)(Param <m> )>
struct   Tester;

template <int   m,class   T>
TOne   Find(Tester <m,T,&T::MemFun> *);

template <int   m,class   T>
TTwo   Find(...);


template <int   m,class   T>
struct   Finder
{
enum{found=(sizeof(Find <m,T> (0))==sizeof(TOne))};
};

int   main(int   argc,char*   argv[])
{
std::cout < <Finder <1,TestCls   > ::found < <std::endl;
std::cout < <Finder <2,TestCls   > ::found < <std::endl;
return   0;
}


  


[解决办法]
好象没什么问题啊

你说的正常和不正常是什么意思
[解决办法]
试了一下,运行结果都一样的。
[解决办法]
升级到8
要有补丁那怎么推出新版啊
[解决办法]
我靠,调试了很长时间,发现空行也能影响编译结果,比如之前的代码,把#include部分修改如下:

#include <iostream>
#include <Windows.h>


#include <string>
//...以下省略

输出结果为
0
0

中间少一个空行,如:
#include <iostream>
#include <Windows.h>

#include <string>
//...以下省略

输出结果为
1
1

其他类似的细小改动也能影响结果,不继续调试了。

[解决办法]
VC7.X就不要提了,bug太多的版本,简直比VC6还不可用。
直接升级到VC8

热点排行