如何让模板类的子类型的可见度扩大到类的外面?

cxjddd 2003-02-26 05:09:43
模板类的子类型只在类的内部可见。在类外面要用的话,必顺是public的,且要用::。现在我的问题是,如何把子类型搞出来,让它变成全局的。
下面是大概的程序:
template<typename T>
class C
{
typedef C* base_ptr;
...
};
// use C::base_ptr
typename C<int>::base_ptr ptr;
// how to make it like this: base_ptr<int> ptr;
// the following are wrong
// using C::base_ptr;
// typedef C::base_ptr ptr;
...全文
29 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxjddd 2003-05-04
  • 打赏
  • 举报
回复
结帖了。

不能直接用using或typedef来解决的了。感谢大家。
mr_oydy 2003-02-27
  • 打赏
  • 举报
回复
我的想法:
template<typename T>
class C{
typedef C* base_ptr;
};

template<typename T,class B=C<T>/**/>
struct Skin_C:public B{
typedef typename Skin_C::base_ptr base_ptr;
}; // 相当于template<class T> typedef C Skin_C

typedef Skin_C<int>::base_ptr int_ptr;

void fun(){
Skin_C<int> m_c; // C<int> m_c;
Skin_C<int>::base_ptr p = &m_c;
}
chinajiji 2003-02-26
  • 打赏
  • 举报
回复
//一个不完备的解决方案,仅供参考;
//基本思路,用一个class 来表示概念.
#include <iostream>
#include <string>
using namespace std;

template<typename T>
class C
{
public:
typedef C* base_ptr;
C(const T &str) : m_str(str) {}
const T& what() const {
return m_str;
}
private:
T m_str;
};

//copy constructor, operator=,operator[],operatr*,等成员函数没有写出,
//继承与多态没有考虑.内存管理的设计需要慎重考虑.
template<typename T, bool onHeap = true>
class base_ptr
{
public:
base_ptr() : m_ptr(NULL) {};
base_ptr(C<T>::base_ptr pC) : m_ptr(pC) {}
~base_ptr() {
if(onHeap) delete m_ptr;
}
C<T>::base_ptr operator->() {
return m_ptr;
}

private:
C<T>::base_ptr m_ptr;
};
int main() {
base_ptr<int> int_ptr = new C<int>(2003);
cout << int_ptr->what() << endl;
base_ptr<string> string_ptr = new C<string>("hello, I'm Chinajiji!");
cout << string_ptr->what() << endl;
C<long> testC(5000);
base_ptr<long,false> ptest = &testC;
cout << ptest->what() << endl;
return 0;
}

/*运行结果
2003
hello, I'm Chinajiji!
5000
Press any key to continue
*/
北极猩猩 2003-02-26
  • 打赏
  • 举报
回复
只要把类型定义写在public部分就行了,向楼上一样

楼上的,应该是
typedef typename C<int>::Base_PTr ptr;
才对
earthharp 2003-02-26
  • 打赏
  • 举报
回复
template<typename T>
class C
{
private:
typedef C* base_ptr;
public:
typedef base_ptr Base_Ptr;
};


typedef C<int>::Base_Ptr ptr;

int main()
{
ptr a;
}
cber 2003-02-26
  • 打赏
  • 举报
回复
这个问题在最近的newsgroup(comp.lang.c++.moderated)上面已经有人提过,我昨天看了一下David Abrahams的回复,大意是说,在特化前,你不能在模板类外部使用其成员类型,要用只能用那种full qualified name,正如你上面给出的typename C<T>::base_ptr那样

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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