类是否可以用作泛型命名空间(使用模板)

Can a class be used as generic namespace (using templates)?

本文关键字:命名空间 泛型 是否      更新时间:2023-10-16

我有一个命名空间,里面有几个函数,我在一个已经定义的类中使用

class Object {
struct SubObject{
//...
};
//...
};

namespace Process
{
Object::SubObject function1(Object& o){
//..        
}
void function2(Object& o){
//..
}
}

现在,我必须用一个模板来概括这些函数,我注意到我不能在整个命名空间上使用一个模板。要么我必须为每个函数制作一个模板(考虑到我每次都必须对类的每个结构进行typedef,这相当乏味),要么我想知道我是否可以定义一个类而不是名称空间:

template<typename TObject>
class Process
{
typedef typename TObject::SubObject TSubObject;
TSubObject function1(TObject& o){
//..        
}
void function2(TObject& o){
//..
}
}

这是正确的代码吗?做一个我永远不会上的课似乎很奇怪。

此外,我首先写道:

typedef TObject::SubObject TSubObject;

但我的编译器要求我在TObject前面添加typename,我发现这个问题解释了(或者我就是这么理解的)这是因为编译器不知道SubObject是嵌套类型还是成员变量。但是typedef后面不是必须跟一个类型,然后是一个别名吗?我认为类成员(变量或函数)不能是"typedef"ed。

提前感谢您的回答。

C++语法/规范规定,任何时候,只要有一个限定名称可能是类型或变量(即使在typedef上下文中),它都将被视为变量,除非您在它前面加上typename