woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

VC6不支持的模板特性

1. 部分特化

 

2. 模板嵌套(即template< template <... > >

 

3. 模板参数形式匹配(不知道该用什么名字描述合适):

template<typename TType> struct PtrType2Type;
template<typename TType> struct PtrType2Type<TType *>
{
    typedef TType Result;
};

第二行指定模板参数的形式必须是某个类型的指针。无法编译通过。

 

4. 从对常数型模板参数做推导时,该模板参数必须在模板参数列表的第一位:

template<int Value>
struct Int2Type
{
    enum { value = Value };
};

template<int Index, class TType>
void Test(TType &data, Int2Type<Index>)
{

    cout << data << endl;
}

int main(int argc, char* argv[])
{
    Test(1, Int2Type<0>());

    return 0;
}

上面的程序可以正常运行,输出1。但如果把

template<int Index, class TType>
改成

template<class TType, int Index>

程序可以编译通过,但运行时什么也不会输出,看起来是

Test(1, Int2Type<0>());

这一行被直接忽略掉了!

 

5. 模板成员函数的模板参数只能通过函数实参让编译器去推导,而不能显示指定。

struct SomeClass
{
    template<class T>
    void Test(T & t)
    {
    }
};

int main(int argc, char* argv[])
{
    SomeClass obj;
    obj.Test(2);

    return 0;
}
这样是可行的。如果改成这样:

 

struct SomeClass
{
    template<class T>
    void Test()
    {
    }
};

int main(int argc, char* argv[])
{
    SomeClass obj;
    obj.Test<int>();

    return 0;
}

将无法编译通过,编译器提示 type 'int' unexpected

如果再改成静态成员函数,这样:

 

struct SomeClass
{
    template<class T>
    static void Test()
    {
    }
};

int main(int argc, char* argv[])
{
    SomeClass::Test<int>();

    return 0;
}

也无法编译通过,而且是 NTERNAL COMPILER ERROR

 

 

posted on 2008-11-13 14:25 肥仔 阅读(2296) 评论(0)  编辑 收藏 引用 所属分类: C++ 模板


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理