一个类可以用作通用命名空间(使用模板)吗?

时间:2014-01-14 17:00:46

标签: c++ templates namespaces

我有一个名称空间,其中包含几个已经定义的类

的函数
class Object {
    struct SubObject{
        //...
    };
    //...
};


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

    void function2(Object& o){
        //..
    }
}

现在,我必须使用模板来概括这些函数,我注意到我不能在整个命名空间中使用一个模板。要么我必须为每个函数创建一个模板(相当乏味,考虑到我每次都必须键入每个类的每个结构),或者我想知道我是否可以做类似定义类而不是命名空间的事情:

template<typename TObject>
class Process
{
    typedef typename TObject::SubObject TSubObject;

    TSubObject function1(TObject& o){
        //..        
    }

    void function2(TObject& o){
        //..
    }
}

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

另外,我先写道:

typedef TObject::SubObject TSubObject;

但我的编译器要求我在TObject前面添加typename,我发现这个question解释(或者我理解它的方式)是因为编译器不知道SubObject是嵌套类型还是成员变量。但是不是typedef强制性地跟着一个类型,然后是别名吗? 我认为类成员(变量或函数)不能是“typedef”ed。

提前感谢您的回答。

1 个答案:

答案 0 :(得分:0)

C ++语法/规范声明,只要存在可以是类型或变量的限定名称(即使在typedef上下文中),它将始终被视为变量,除非您在其前面加上它与typename