2011-06-04 51 views
2

我想做的事:如何內部類模板類分隔成其他文件

typedef MyTemplateClass<Type01, Type02> TClass; 
TClass t; 
TClass::InnerClass i; 
i.test(); 

我認爲解決的辦法可能是:

template <typename A, typename B> 
class MyTemplateClass 
{ 
public: 
    class InnerClass 
    { 
     //here I can do stuff with A and B 
     A test() { return 0; } 
    }; 

    friend class InnerClass; 
}; 

,但我想有馬模板單獨* .inl文件包含在頭文件底部

如何在其他文件中定義這種行爲?

當我這樣做只是

//file.inl 
class InnerClass 
{ 
    //here I can do stuff with A and B 
    A test() { return 0; } 
}; 

A和B是不確定的。

template <typename A, typename B> 
class InnerClass 
{ 
... 
}; 

讓我的方法依賴模板MyTemplateClass類型的...

再次一句話: 如何使MyTemplateClass的在將InnerClass其他文件,提供

TClass::InnerClass i; 
i.test(); 

行爲?

回答

4

你不能。簡而言之。模板必須在實例化之前完全定義 - 這意味着無論你做什麼,都必須在模板類中定義內部類。

6

它的工作原理相同的使用非模板時爲:你必須完全限定成員的名字:那會是

struct outer { 
    struct nested; 
}; 

struct outer::nested { 
    int 
    test(); 
}; 

int 
outer::nested::test() 
{ /* whatever */ } 

你的情況:

template <typename A, typename B> 
class MyTemplateClass { 
public: 
    class InnerClass; 

    friend class InnerClass; 
}; 

// note the use of the <> brackets 
template<typename A, typename B> 
class MyTemplateClass<A, B>::InnerClass { 
public: 
    A 
    test(); 
}; 

// ditto 
template<typename A, typename B> 
A 
MyTemplateClass<A, B>::InnerClass::test() 
{ return 0; } 

必須謹慎的定義順序,但:如果例如MyTemplateClass具有使用InnerClass的功能成員,則InnerClass的定義必須在使用點處可見。

簡單的經驗法則:內聯一切或什麼都不要。要麼你定義的一切行內的(InnerClass類定義兩個類的成員函數)內MyTemplateClass,或者你把所有的所有函數成員(包括MyTemplateClassInnerClass的)的定義在最後InnerClass後就一直定義。

不要擔心,如果你搞砸你的編譯器只會很樂意幫你處理錯誤信息。

相關問題