2011-06-30 70 views
2

在下面的代碼模板的錯誤,我得到的是我沒有一個編譯錯誤,如果我刪除模板:與相關的名稱

template<int DIM> class myClass 
{ 
public : 
    enum Mode {aa,bb}; 
    myClass(){}; 
}; 

template<int DIM> class myClass2 
{ 
    myClass2(){}; 
    void myfunc(myClass::Mode m); 
}; 

template<int DIM> 
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m) 
{ 
} 

TEST.CPP(19):警告C4346:' MyClass的::模式」:依賴名稱不是
類型前綴與‘類型名稱’指示類型
TEST.CPP(19):錯誤C2146:語法錯誤:缺少‘)’前標識符‘M’

如果我刪除類似:

template<int DIM> 
void myClass2<DIM>::myfunc(myClass::Mode m) 

我得到:

TEST.CPP(19):錯誤C2955: 'MyClass的':使用類模板需要模板參數列表

如果我把myfunc的定義直接放在類的聲明中(我想避免),它的工作原理。

我該怎麼做,爲什麼會發生這種情況?

謝謝

+3

在我看來警告而明確: 「前綴'MyClass的 :: Mode'用'typename'」。 –

+0

請您在下一次提問時發現實際的源代碼包含錯誤,而不是像它或它的某個部分。有關如何以及爲什麼要發佈最小的完整示例程序的信息,請參閱http://sscce.org。 –

+0

@Caron:事實上,當你知道它的時候,這似乎很清楚。但是,當你從來沒有這樣的警告,並且從來沒有看到一個代碼需要用typename關鍵字(我的意思是,除了內部模板)聲明一個類型名稱,這聽起來像所有的奇怪的警告,沒什麼意義....:/ @Rob:好的。 – WhitAngl

回答

6

我相信你在你的代碼中有兩個問題。首先是在這個聲明中myClass2

void myfunc(myClass::Mode m); 

因爲myClass是一個模板,需要指定模板參數是什麼。我認爲你可能是指寫

void myfunc(myClass<DIM>::Mode m); 

然而,由於在C++中一個奇怪的癖好,你會寫爲

void myfunc(typename myClass<DIM>::Mode m); 

typename關鍵字這裏告訴C++是Mode是一個名字嵌套在類myClass<DIM>中。

同樣地,在後面的代碼,該代碼

template<int DIM> 
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m) 
{ 
} 

應該讀

template<int DIM> 
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m) 
{ 
} 

告訴編譯器Mode是一個類型的名稱。

希望這會有所幫助!

+0

是啊!謝謝大家,我錯過了typename!我不知道我們必須補充說明,因爲Mode顯然是一種類型....!第一個問題只是一個錯字:p謝謝,它現在有效:)(4分鐘左右驗證) – WhitAngl

1

在這裏你去...

template<int DIM> class myClass 
{ 
public : 
    enum Mode {aa,bb}; 
    myClass(){}; 
}; 

template<int DIM> class myClass2 
{ 
    myClass2(){}; 

    // you need to pass the template parameter to myClass 
    // "typename" needs to be present when using types from templated classes 
    // from within a templated class/function. 
    void myfunc(typename myClass<DIM>::Mode m); 
}; 

template<int DIM> 
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m) 
{ 
} 
相關問題