2012年(158)
分类: C/C++
2012-11-19 11:02:29
有关模板的语法很多很杂,无法一一列举,在此仅测试几个简单常用的语法。
以下有关模板的语法分别使用 gcc3.4.2、VC++6.0 和 Intel
C++8.0 进行测试,GCC342和ICC都能完全通过测试,VC++6.0有部分通不过测试。
1. 模板类静态成员
template
static int
_data;
};
template<> int testClass
template<> int testClass
int main( void )
{
cout << boolalpha << (1==testClass
cout << boolalpha <<
(2==testClass
}
2.
模板类偏特化
template
testClass() { cout << "I, O" << endl; }
};
template
testClass() { cout
<< "T*, T*" << endl; }
};
template
testClass() { cout << "const T*,
T*" << endl; }
};
int main( void ) {
testClass
testClass
testClass
}
[注]: VC++6 编译不通过
3. function template partial
order
template
void swap(
testClass
};
template
x.swap( y );
}
int main( void )
{
testClass
testClass
swap( obj1, obj2 );
}
[注]: VC++6
编译不通过
4. 类成员函数模板
struct testClass {
template
cout << t <<
endl;
}
template
return
T();
}
};
int main( void ) {
testClass obj;
obj.mfun(
1 );
int i = obj;
cout << i << endl;
}
[注]:
对于第二个成员函数模板,VC++6 运行异常
5. 缺省模板参数推导
template
T a;
};
template
I b;
O c;
};
6.
非类型模板参数
template
T
_t;
testClass() : _t(n) {
}
};
int main( void )
{
testClass
testClass
}
7. 空模板参数
template
template
return
false;
};
template
friend bool
operator== <>( const testClass&, const testClass& );
};
[注]:
VC++6 编译不通过
8. 模板特化
template
};
template <> struct testClass
};
9.
template class
X>
struct Widget{
};
[注]: VC++6
编译不通过
10. [hpho]提供的一个事例
struct Widget1
{
template
T
foo(){}
};
templateclass X>
struct
Widget2{
};
[注]: VC++6 编译不通过
11.
数组作模板实参
template
{
cout << typeid(T).name() << " (&bar)[" << N
<< "]" << endl;
};
int main()
{
int a[10];
foo( a );
return 0;
}
[注]: VC++6
编译不通过
12. 模板作为模板的参数
template< class T, template
void Test( T, Y
{
}
[注]: VC++6 编译不通过
13.
template
{
foo() {}
foo( const foo& ) {}
template& ) {}
};
int
main()
{
foo
foo
foo
}
[注]:
网友评论2012-11-19 11:07:39
京山游侠
说的问题是:
星哥的第8个测试代码,就是星哥称为"空模板"的那个,其实它就是"模板特化"的标准写法,C++标准推荐的写法,不用给它另外取个名字吧.
提的问题如下:
在M$的ATL中大量使用了一种模板的用法,称为"防真动态绑定",VC6是支持的,不知道其它的编译器支持不(毕竟其它的编译器不需要支持ATL),我写个测试代码如下:
template<class DerivedClass> struct BaseClass {
BaseClass(){
cout << DerivedClass:: i << "In constructor" << endl;
&nbs