从VC6.0平台级到VS2008平台(之二)

来源:互联网 发布:江西广电网络好用吗 编辑:程序博客网 时间:2024/06/11 17:06

3、模板特殊化(Template specialization)

模板的特殊化是当模板中的pattern有确定的类型时,模板有一个具体的实现。例如假设我们的类模板pair 包含一个取模计算(module operation)的函数,而我们希望这个函数只有当对象中存储的数据为整型(int)的时候才能工作,其他时候,我们需要这个函数总是返回0。这可以通过下面的代码来实现:

template <class T>

class Pair {

    T value1, value2;

public:

    Pair (T first, T second){

        value1=first;

        value2=second;

    }

    T module () {return 0;}

};

template <>

class Pair<int> {

    int value1, value2;

public:

    Pair (int first, int second){

        value1=first;

        value2=second;

    }

    int module ();

};

//在模板特例化中,NET的特性

template<> int Pair<int>::module() {

    return value1%value2;

}

这里要注意,在.NET中template<>是不需要的,否则会发生

Compiler Error C2910

Error Message

'function' : cannot be explicitly specialized错误,

见:http://msdn.microsoft.com/en-us/library/cx7k7hcf(VS.80).aspx

4、STLport VS VS2008:

因为VC6对标准C++的支持不够,所以我们用了STLport库,然而在VS2008下MS的已经差不多和标准相同了啊,所以,没有必要在使用STLport库。在整理工程中,把其去掉。

5、旧的CRT库和新的安全CRT库引起的C4996告警

    解决了环境变量设置不匹配导致的问题后,编译过程就真正开始了,不过首先映入眼帘的应该是成堆的C4996编译告警,对每个使用了含字符串参数的CRT库函数都会有C4996编译告警,一个典型的输出如下所示:

f:/project/...../commonfunc.cpp(280) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
e:/software/microsoft visual studio 9.0/vc/include/string.h(74) : see declaration of 'strcpy'

    MSDN online 是这样解释的:为了显著增加CRT库的安全性,许多CRT函数都有了一个更安全的新版本,新版本和旧版本的区别就是新版本函数名多了一个_s后缀。只要一个CRT函数有新的安全版本,编译器就会产生一个C4996告警,不过,出现这个告警的目的并不是说旧版本的CRT函数将淡出CRT库,告警出现只是为了提醒程序员这个函数有更安全的版本存在。一种安全的或者是被鼓励的做法是用安全版本的函数替换现有的CRT函数,不过对于一个有相当代码量的项目,替换工作量也是巨大的,这可不是用名称查找、替换就能简单解决的问题,因为许多安全版本的CRT函数参数个数也发生了变化。也可以用预处理指令消除这个告警:
#pragma warning( disable : 4996 )
或者定义 _CRT_SECURE_NO_WARNINGS 压制这个告警(在stdafx.hdefine或在项目属性中设置预处理符号,PreProcessor Definitions)。

    除了C语言的CRT函数外,POSIX 兼容函数也存在这个告警,解决方法是用POSIX标准名称替换(比如access换成_access)或者是定义 _CRT_NONSTDC_NO_WARNINGS 压制这个告警(方法同上)。