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

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;
...全文
57 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那样
内容概要:本文档详细介绍了基于非线性反步法与Lyapunov函数相结合的模型预测控制(Lyapunov-MPC)在自主水下航行器(AUV)轨迹跟踪中的应用,涵盖经典的Fossen六自由度动力学建模。研究通过融合反步法的系统化递推设计优势与MPC的滚动优化及约束处理能力,构建了一种高性能、强鲁棒性的复合控制策略,有效提升了AUV在复杂海洋环境下的轨迹跟踪精度与系统稳定性。文档提供了完整的Matlab代码实现方案,适用于高水平学术论文(如SCI一区)的复现与科研验证,具有较强的理论深度与工程实践价值。; 适合人群:具备自动控制理论、非线性系统分析、现代控制方法(如反步法、李雅普诺夫稳定性理论、MPC)基础,并熟悉Matlab/Simulink仿真工具的研究生、科研人员及从事水下机器人、无人系统控制开发的工程技术人员。; 使用场景及目标:①用于高精度AUV轨迹跟踪控制系统的设计与仿真验证;②深入学习和掌握非线性反步法的设计流程、Lyapunov稳定性分析方法及其与MPC框架的集成技巧;③服务于高水平学术论文的复现、算法对比与技术创新研究,推动水下航行器智能控制技术的发展。; 阅读建议:建议读者首先深入理解Fossen动力学模型的物理意义与数学表达,重点剖析反步法的虚拟控制量构造与李雅普诺夫函数的设计思路,进而研究如何将稳定性条件融入MPC的优化目标中。务必结合所提供的Matlab代码进行逐行调试与参数敏感性分析,通过仿真实验直观感受不同海况与初始偏差下的控制性能,从而深刻理解理论设计与实际效果之间的内在联系。

24,851

社区成员

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

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