2014-01-14 35 views
0

我有几个功能,我用的是已经定义类可以用作通用名称空间(使用模板)吗?

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的前面加上类型名,我发现这个question解释(或者这就是我理解它),这是因为编译器没有按不知道SubObject是嵌套类型还是成员变量。但是不是typedef强制后跟一个类型,然后是一个别名? 我认为一个类成员(一个变量或函数)不能被“typedef”编辑。

非常感谢您的回答。

+0

如果没有实例,你不能调用你的示例中的函数,那么你需要使它们成为“静态”函数!另一种选择是简单地在名称空间级别提供模板化函数。 –

+0

@πάνταῥεῖ:是的,但我必须为命名空间中的每个函数创建一个模板,并为每个函数中的每个嵌套类型创建一个typedef(我在Object中有十几个嵌套类型,我想避免使用typedef/typename每次)。 – Demod

+0

然后在模板类中使用静态函数的其他选项。 –

回答

0

C++语法/规范指出,任何时候都有一个可能是类型或变量的限定名称(即使在上下文中也是如此),除非用前缀typename作为变量,否则它将始终被视为变量。

相关问题