C++模板一问

q598162221 2015-02-12 10:33:10
#include <stdio.h>
template<class T>
class Base
{
public
static T t;
};

class TestClass :public Base<TestClass>
{
public
TestClass ()
{
printf("run \n");
}
};

int main()
{
return 0;
}


我就想知道有没有办法在Base中直接实例化一个TestClass ...上面那种写法不会输出run
...全文
193 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2015-02-12
  • 打赏
  • 举报
回复

#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


 int main()
 {
   void* p = &TestClass::t;
   return 0;
 }
你要使用它,否则static成员可能被优化掉了 void* p = &TestClass::t;
mujiok2003 2015-02-12
  • 打赏
  • 举报
回复

#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


 int main()
 {
  TestClass x;
   return 0;
 }
FightForProgrammer 2015-02-12
  • 打赏
  • 举报
回复
base添加构造函数,然后构造testBzse的时候会调用基类的构造函数啊。行不行
ri_aje 2015-02-12
  • 打赏
  • 举报
回复
给 TestClass 增加一个不 printf 的构造函数,在 Base 中定义的时候调用新增的构造函数。 还有 TestClass 不是类模板,没法实例化。
mujiok2003 2015-02-12
  • 打赏
  • 举报
回复
引用 9 楼 q598162221 的回复:
[quote=引用 6 楼 mujiok2003 的回复:] [quote=引用 5 楼 q598162221 的回复:] 我要的就是不使用它能做到这种效果...
#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


template class Base<TestClass>; //explicit template Instantiation


 int main()
 {  
   return 0;
 }
[/quote] template class Base<TestClass>; //explicit template Instantiation 这一行有没有可能去掉[/quote] 模板的实例化要么隐式(需要使用),要么显示,没有其他。
q598162221 2015-02-12
  • 打赏
  • 举报
回复
引用 7 楼 sdghchj 的回复:
#include <stdio.h> template<class T> class Base { public static T t; }; //有了静态模板成员声明,还得有其定义 template<class T> T Base<T>::t; class TestClass :public Base<TestClass> { public TestClass () { printf("run \n"); } }; //然后还得在类外,调用一次静态模板成员以进行模板实例化。 TestClass TestClass::t; //或者TestClass Base<TestClass>::t; //又或者将此行移到main函数中也行,总之都是让编译器去实例化模板。 int main() { return 0; }
我就是不想多加这一句...有没有办法
q598162221 2015-02-12
  • 打赏
  • 举报
回复
引用 6 楼 mujiok2003 的回复:
[quote=引用 5 楼 q598162221 的回复:] 我要的就是不使用它能做到这种效果...
#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


template class Base<TestClass>; //explicit template Instantiation


 int main()
 {  
   return 0;
 }
[/quote] template class Base<TestClass>; //explicit template Instantiation 这一行有没有可能去掉
q598162221 2015-02-12
  • 打赏
  • 举报
回复
template class Base<TestClass>; //explicit template Instantiation 这一行有没有可能去掉
sdghchj 2015-02-12
  • 打赏
  • 举报
回复
#include <stdio.h> template<class T> class Base { public static T t; }; //有了静态模板成员声明,还得有其定义 template<class T> T Base<T>::t; class TestClass :public Base<TestClass> { public TestClass () { printf("run \n"); } }; //然后还得在类外,调用一次静态模板成员以进行模板实例化。 TestClass TestClass::t; //或者TestClass Base<TestClass>::t; //又或者将此行移到main函数中也行,总之都是让编译器去实例化模板。 int main() { return 0; }
mujiok2003 2015-02-12
  • 打赏
  • 举报
回复
引用 5 楼 q598162221 的回复:
我要的就是不使用它能做到这种效果...
#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


template class Base<TestClass>; //explicit template Instantiation


 int main()
 {  
   return 0;
 }
q598162221 2015-02-12
  • 打赏
  • 举报
回复
引用 4 楼 mujiok2003 的回复:

#include <cstdio>
 template<class T>
 class Base
 {
  public: 
   static T t;
 };
 
template<class T>
T Base<T>::t;

 class TestClass :public Base<TestClass>
 {
 public: 
    TestClass ()
    {
     printf("run \n");
    }
 };


 int main()
 {
   void* p = &TestClass::t;
   return 0;
 }
你要使用它,否则static成员可能被优化掉了 void* p = &TestClass::t;
我要的就是不使用它能做到这种效果...

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧