2013-03-06 164 views
0

我想編譯下面的代碼。嵌套模板typedef - 類型定義

文件Class12.h

template <class T1> 
class class1 
{ 
public: 
typedef T1 Type1; 
void class1Method(); 
}; 

template <class T1> 
void class1<T1>::class1Method() 
{ 
} 


template <class T1, class T2> 
class class2 
{ 
public: 
typedef T2 Type2; 
void class2Method(); 
}; 

template <class T1, class T2> 
void class2<T1,T2>::class2Method() 
{ 
    typedef typename::class2<typename class1<T1>::Type1, T2> Type3; 
} 

文件class.h

#include "class12.h" 

template<> 
class class2<int,double> 
{ 
}; 

但是我得到以下錯誤:

g++ -g -c class.h -o class.o 
In file included from class.h:1: 
class12.h: In member function `void class2<T1, T2>::class2Method()': 
class12.h:27: error: expected nested-name-specifier 
class12.h:27: error: expected init-declarator before "Type3" 
class12.h:27: error: expected `,' or `;' before "Type3" 
make: *** [class.o] Error 1 

有人可以幫我嗎?

非常感謝您的時間提前。 謝謝。

+0

唉,標籤濫用...你能編輯你的文章嗎? – 2013-03-06 21:25:57

+0

@Kerrek SB你是什麼意思?現在好嗎? :) – geraldCelente 2013-03-06 23:36:39

+0

要格式化您的代碼,您必須使用空格或製表符,但不能同時使用兩者。如果混合,縮進不會按照你想要的方式出現。它仍然是壞的。 – 2013-03-07 08:45:36

回答

1

那麼,編譯器是非常明確的:class1是一個類模板,所以它需要模板參數。您沒有任何這裏:

typedef typename class2<typename class1::Type1> Type3; 
      //       ^here! 

您需要的形式

typedef class2<typename class1<T>::Type1> Type3; 

的一些地方T可能T2。請注意,不需要第一個typename

正如你在上一個問題中,typedefs應該是public

+0

按照你的建議和安迪的我已經更新了相應的結尾。然而,現在我得到錯誤g ++ -g -c class12.h -o class12.o class12.h:在成員函數'void class2 :: class2Method()': class12.h:25:error :預期的嵌套名稱說明符 class12.h:25:錯誤:預期的init-declarator在「Type3」之前 class12.h:25:error:expected','或';'在「Type3」之前 make:*** [class12.o]錯誤1 – geraldCelente 2013-03-06 22:22:56

+0

@geraldCelente您是否按照我的建議讓typedefs爲'public'?此外,它看起來像你正試圖將模板代碼編譯成一個目標文件。你不能那樣做。你需要將它包含在用特定類型實例化的代碼中,然後編譯*那個*代碼。 – juanchopanza 2013-03-06 22:27:06

+0

你好,那裏。非常感謝你的時間和耐心:)。我已根據您的建議和Andy的更新了代碼。但是我不斷收到相同的錯誤。老實說,我不認爲這個問題與我的代碼中的訪問級別有關,在這個例子中,這些類型都是公開的。 – geraldCelente 2013-03-06 23:50:48

1

在這一行:

typedef typename class2<typename class1::Type1> Type3; 

你不提供對class1<>類模板的任何模板參數。此外,除非有合格的相關名稱,否則不需要typename關鍵字。你是否有一個取決於你想如何實例化class1<>

而且,如果你想擁有class1Method()class2Method()class1成員函數和class2分別,你應該使用這樣的語法:

template <class T1> 
class class1 
{ 
    typedef T1 Type1; 
    void class1Method(); 
}; 

template <class T2> 
void class1<T2>::class1Method() 
// ^^^^^^^^^^^^ 
{ 
} 

UPDATE:

編輯後,代碼您的問題還有一個問題:class2Method()成員函數中名稱class2指的是函數是其成員的類,它是實例class2

typedef typename ::class2<typename class1<T1>::Type1, T2> Type3; 
//    ^^ 

另外,不要忘了給正確的訪問級別:要參考class2模板,你可以用它屬於(在這種情況下,全局命名空間)的命名空間限定名稱您的課程成員,或者您將無法從其成員功能以外訪問它們:對於class es,默認值爲private。我認爲你應該在這種情況下使用public。例如:

template <class T1> 
class class1 
{ 
public: // <== MAKE THE MEMBERS AND TYPE DEFINITIONS ACCESSIBLE TO 
     //  FUNCTIONS WHICH ARE NOT MEMBER FUNCTIONS OF THIS CLASS 
    typedef T1 Type1; 
    void class1Method(); 
}; 
+0

按照你的建議和juanchopanza的我已經更新了相應的結尾。然而,現在我得到錯誤g ++ -g -c class12.h -o class12.o class12.h:在成員函數'void class2 :: class2Method()': class12.h:25:error :預期的嵌套名稱說明符 class12.h:25:錯誤:預期的init-declarator在「Type3」之前 class12.h:25:error:expected','或';'在「Type3」之前 make:*** [class12.o]錯誤1 – geraldCelente 2013-03-06 22:25:20

+0

@geraldCelente:請參閱我的回答更新 – 2013-03-06 22:31:55

+0

您好,那裏。非常感謝您的時間和耐心:)。我已根據您的建議和juanchopanza更新了代碼。但是我不斷收到相同的錯誤。老實說,我不認爲這個問題與我的代碼中的訪問級別有關,在這個例子中,這些類型都是公開的。 – geraldCelente 2013-03-06 23:42:06