注册 登录
编程论坛 C++教室

请问一下各位,都用什么样的编译器?

cookies5000 发布于 2009-10-31 01:09, 505 次点击
#include <iostream>
#include <string>
using namespace std;

template <typename T>
T const & max2(T const & a, T const & b )
{
    return a<b?b:a;
}
template <typename T>
T * const &max2(T* const &a ,T * const &b)
{
    return *a<*b?b:a;
}

const char * const & max2(const char * const &a, const char * const &b)
{
    return strcmp(a,b)<0? b:a;
}
//
int main()
{
    int ia=3;
    int ib=8;
    char * s1="hello";
    char * s2="hell";
    cout<<* max2(&ia, &ib)<<"\n";
    cout<<  max2(ia,ib)<<"\n";
    cout<<  max2(s1,s2)<<"\n";
    return 0;
}

//
上面这几行代码,我在VC++6.0上编译不过,错误提示的大意好象是max2不知道如何匹配。可在Visual Studio2005
下却顺利通过。。。
请问各位:    1. 是编译器的差异造成这种现象吗?
              2. 各位都用什么样的编译器?有哪种是"标准的"?(很愚蠢的问题,请别笑出声来).
3 回复
#2
flyingcloude2009-10-31 09:30
这个是编译器差异造成的。
用gcc,编译能够通过。gcc最接近c99标准
#3
pangding2009-10-31 09:58
嗯,VC6.0与标准不一致的地方非常多。所以如果用VC6.0的话,就不要用太偏僻的语法特性。
另外,还有一些(主要是稍老一点的)编译器也不支持所谓“偏特化”(还是什么的,我也不太知道应该翻译成什么)这个特征,就是在处理类型匹配上,选择更加精确的。
比如这个(如果你写的这是一个演示用例,我觉得去掉那些 const 简洁些,更能说明问题。),你传一个char*,有三种可能:
既可以匹配T,把 T 解释成 char*
也可以匹配T*,把 T 解释成 char
当然还可以匹配模版的 char*
标准说应该选择最精确的匹配,就是,按照我刚写的由下向上匹配。要是没在定义下面的,就用上一层的匹配。
 
支持这种特性,可以利用语法让编程变得轻松些,不过这些语法不是必须的,也就是说,完全可以利用编程技巧避免使用这个语法特性。一些良好的可移植代码,一般都可以利用条件处理让编译器成生最佳效果的语句。
#4
cookies50002009-10-31 15:44
谢谢flyingcloude:我知道了 gcc .呵呵

谢谢pangding:

“支持这种特性,可以利用语法让编程变得轻松些,不过这些语法不是必须的,也就是说,完全可以利用编程技巧避免使用这个语法特性。一些良好的可移植代码,一般都可以利用条件处理让编译器生成最佳效果的语句。”

这话经典啊!使我明白了一点:不走“边缘路线”,尽可能让代码为编译器所接受。


1