同时精通 类模板,嵌套类,多模板的进来,用C++ 近十年了解决不了这个问题,惭愧啊!

dext 2009-03-13 02:17:56
如下代码,我连声明都些不出来,勉强写出一个,居然在
g++(Linux), VC++ 2008, MinGW 中 全有错,
意外发现,VC++6 可以通过,很是郁闷。
注:有问题的代码很长,不能写在类里。
代码如下:


#include <iostream>

using namespace std;

template<typename T1, typename T2=void*, typename T3=void*>
class Test {
public:
Test();
class Inter {
public:
T2 t2;
Inter();
};
Inter* get();
Test* ttt();
protected:
private:
T1 t1;
};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>::Test() {};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>::Inter::Inter() {};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>*
Test<T1, T2, T3>::ttt() {};

// 不会写声明,实现更无从说起。这个只有VC++6可通过
template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>::Inter*
Test<T1, T2, T3>::get() {return NULL;};

int main(int argc, char *argv[]) {
printf("Hello, world\n");
return 0;
}
...全文
94 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dext 的回复:]
呵呵,真的受教了,版主还帮我删了一贴,估计是对我的嘲笑吧。
以前听说过 typename 以为他只是在模板声明中简单的替代了 class。
谢谢 pengzhixi 的最后解释。
[/Quote]
重复发帖了吧.
dext 2009-03-13
  • 打赏
  • 举报
回复
呵呵,真的受教了,版主还帮我删了一贴,估计是对我的嘲笑吧。
以前听说过 typename 以为他只是在模板声明中简单的替代了 class。
谢谢 pengzhixi 的最后解释。
pengzhixi 2009-03-13
  • 打赏
  • 举报
回复
Test<T1, T2, T3>::Inter*//加上typename 否则Inter 会被看做是Test里面的静态成员
北极猩猩 2009-03-13
  • 打赏
  • 举报
回复
Test* ttt();

这个声明是有问题的,Test是一个类模板而不是类,不能直接作为返回值。
应该写成
Test<T1, T2, T3>* ttt();

建议你在模板定义里面直接写typedef Test<T1,T2,T3> ThisType;用起来可以省力一点
  • 打赏
  • 举报
回复

#include <iostream>

using namespace std;

template<typename T1, typename T2=void*, typename T3=void*>
class Test {
public:
Test();
class Inter {
public:
T2 t2;
Inter();
};
Inter* get();
Test* ttt();
protected:
private:
T1 t1;
};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>::Test() {};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>::Inter::Inter() {};

template<typename T1, typename T2, typename T3>
Test<T1, T2, T3>*
Test<T1, T2, T3>::ttt() {};

// 不会写声明,实现更无从说起。这个只有VC++6可通过
template<typename T1, typename T2, typename T3>
typename Test<T1, T2, T3>::Inter* //<=======加一个typename就可以了
Test<T1, T2, T3>::get() {
return NULL;
};

int main(int argc, char *argv[]) {
printf("Hello, world\n");
return 0;
}

64,642

社区成员

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

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