最新评论
re: 混沌 IN C++::模板参数的奥秘 Ray L 2008-05-02 06:16
我想你的看法有问题,类型定义本来就不具备外部连接。
re: 混沌 IN C++::模板参数的奥秘 winlin 2006-09-02 10:28
楼主,我写了一下,发现若是自定义类型作为模板的参数,要有两个条件:
1.参数为全局变量,不能是静态或者const的.
2.模板中要指针,引用不行.
代码如下:
1.首先是作为参数的自定义类的定义:
class Tplt
{
public:
void Display();
};
2.然后是模板定义:
template<class T, T *arg>
class Container
{
public:
void Do()
{
name.Display();
arg->Display();
}
private:
T name;
};
其中,T*也可以写成Tplt*.
3.主函数:
Tplt arg;//必须是全局变量
void main()
{
//WinLin::Instance()->Display();
Container<Tplt,&arg> theObj;
theObj.Do();
}
所以我就那么认为了,要全局的自定义变量才可以作为模板参数;
敬请楼主和各位大虾指正/lh,偶的邮箱是winterServer@126.com
若确实如此,也请给小弟发封邮件,先感谢了.
您举的几个事例中条件都能在编译期间确定,因此说template替代if/if-else是不正确的,您这属于C++模板元编程(metaprogram)的范畴,模板元编程代替不了if-else,顶多能代替部分#if-#elif而已。
的确没有,虽然我们专注于.NET技术,但仍然非常欢迎大家踊跃发表自己的技术心得,不限于.NET
re: 混沌 IN C++::模板参数的奥秘 oldjacky 2004-06-08 19:42
因为局部类不会被外部使用,所以会在编译函数的时候同时编译,但编译模版却是在这个过程之前,因此他不能够做为模版类型。
鸡丁兄:老师不是说过吗,new 分配的内存不要用 free 释放,另外“自动存储区”和“堆”在 C++ 编译器面前似乎是。。。一个东西?
void * operator new (size_t _sz)
{
return malloc(_sz);
}
void operator delete (void * p)
{
free(p);
}
偶觉得似乎。。。这个东西没什么不对。不能混用的理由是,很多时候 delete 的实现不是这么简单一个 free 搞定的。
re: 周星星 辣子鸡丁 2004-06-08 15:08
我大侠算不上,只是了解点这些小规则
对了,忘记了局部类。下午回来我把这点在文中补充上,谢谢提醒。
:-)
请教大侠: 周星星 2004-06-08 09:14
全局和静态对象的内存分配发生在编译期,但模板需要的只是变量类型而已,局部变量的类型在编译期也可以确定呀,为什么局部变量和局部定义的类型(比如定义在函数中的class)不能作为模板的参数?这个问题困扰我很久,望指教!
re: 混沌 IN C++::模板参数的奥秘 unruledboy(灵感之源) 2004-06-08 08:57
你怎么发了又发?
to 辣子鸡丁: 周星星 2004-06-07 09:15
3ku!
文章主要目的是澄清一个概念,自由存储区和堆,这也说了new分配的东西为什么不能用free来释放
注意,在C++中使用malloc和free是很正常的!
::operator new和::operator delete
re: 混沌 IN C++::动态资源管理陷阱 hBifTs 2004-06-06 21:06
做为标准C++而言,都提倡使用new/delete
尽量不要去使用老式的,C风格的malloc/free.
所以呢,我觉得这样的问题不是很有意义的:P
to 周星星
真是无处不在哟,呵呵 :-P
A a( A() );
这个具有二义性的声明到底是 一个函数声明 还是 对象声明?
目前的情况是
VC 6/VC.NET 认为是对象声明。
GCC 2.9之后认为是函数的声明。
而C++ Standard 也认为这是函数的声明。
-------------------------------
A a;
A b();
既然知道后者是函数的声明,那么这种形式与 A a( A() ); 还有什么区别吗?没有
:)我对 A a( A() ) 有一些不同的观点,请参考
A() 是构造一个类A的无名实例,A a( A() ) 就是拷贝构造类A的实例a; 我的试验代码如下:
#include <iostream>
using namespace std;
struct A
{
A(){}
};
int main()
{
A a( A() );
cout << typeid(A()).name() << endl;
cout << typeid(a).name() << endl;
return 0;
}
仁兄有雅兴,我继续说几句:其实最令初学者混淆的是
struct A
{
A(){}
};
int main()
{
A a; 这两个
A b(); 的差别?
return 0;
}
回去吃饭了,886!