2012-05-29 50 views
3

我想在我的C++程序中使用typedef結構。我開始編寫下面的代碼,直到我嘗試將方法添加到返回模板typedef結構指針的類時收到錯誤。C++類Typedef Struct沒有命名一個類型

StructSource.h

template <typename T> 
class StructSource { 
public: 
    struct TestStruct{ 
     T value; 
    }; 
}; 

User.h

#include "StructSource.h" 

class User { 
    public: 
     typedef StructSource<int>::TestStruct IntStruct; 

     IntStruct *getIntStruct(); 

}; 

User.cpp

#include "User.h" 

IntStruct *User::getIntStruct() { 
    return 0; 
} 

用gcc編譯時,這提供了以下錯誤。

User.cpp:3:1: error: ‘IntStruct’ does not name a type

我無法解釋爲什麼會出現這種情況。我缺少什麼類型的信息?

+4

當我正在查找重複的問題時,快速回答:使用'User :: IntStruct'。 – Xeo

+0

*拍打額頭*當然。 – Nexus

回答

11

「用戶」也有「命名空間」(範圍,實際上,大多數評論者指出的 - 「命名空間」是一個快速的答案)在這裏,所以你必須使用

User::IntStruct *User::getIntStruct() { 
    return 0; 
} 
+1

它不是一個名稱空間,它是*範圍*。而你只需要使用它,因爲返回類型不在類作用域內,而其餘的聲明/定義是。實際上,即使是後期指定的返回類型(C++ 11)也在類範圍內:auto User :: getIntStruct() - > IntStruct * {return 0; }'。 – Xeo

+1

當然,這就是爲什麼我把它稱爲「名字空間」的引號。 「範圍」也使運行時間的東西混亂。 –

5

您需要:

User::IntStruct *User::getIntStruct() { ... } 

IntStruct是User範圍內定義,但函數的返回值不在範圍之內。有關於這些範圍問題here的討論。

2

由於IntStruct是在類中定義,您必須使用類名來引用它,除了它是默認名稱搜索路徑的一部分的類代碼中。

User::IntStruct *User::getIntStruct() { 

這是不相同命名空間,即使該語法是相同的。