標籤:

為什麼不能在 std::map 中使用局部類型?

我要定義一個map

typedef struct ZkStruct
{
int x;
char s[20];
} ZkStruct;
map& zkmap;

為什麼這個結構體要定義成全局變數,才能編譯通過。如果放到main函數中就報錯呢?


@藍木達 大嬸的關注點才對嘛。

typedef struct ZkStruct
{
int x;
char s[20];
} ZkStruct;

這種寫法雖然在C++中已經不必要了,不過也不是這裡出錯的原因。

看了藍木達大嬸的回答之後,翻了一下文檔:

C++ 98/03中確實不能用local type作為template argument,具體內容如下:

A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter. [Example:

template & class X { /* ... */ };
void f()
{
struct S { /* ... */ };
X& x3; // error: local type used as template-argument
X& x4; // error: pointer to local type used as template-argument
}

end example] [Note: a template type argument may be an incomplete type (3.9). ]

C++ 0x/11中不再有這個限制了,可以參考這個帖子:Local type as template arguments in C++

所以,如果確實想這樣用,找一個支持C++ 0x/11的C++ 編譯器(比如:VS2010、VS2013、GCC 4.8.2),並打開C++ 0x/11開關。

而且,題目描述中「定義成全局變數」也有誤啊。


C++標準裡面的 14.3.1 「temp.arg.type」裡面的第2條寫了:

局部類型不應該作為模板的類型參數。

而你若把類型定義放到了函數裡面,它就變成了上面所說的「局部類型」。


「定義成全局變數」,樓主是從腳本語言轉過來學C++的吧。

而且在C++裡面,定義一個結構體的寫法是

struct ZkStruct {
int x;
char s[20];
};

你那是C裡面常用的寫法。

int main() {
struct ZkStruct {
int x;
char s[20];
};

map& m;

return 0;
}

編譯通過,毫無問題。


推薦閱讀:

如何評價 JetBrains 的新 C/C++ IDE CLion?
C++ unordered_map 中 double 作key如何在模板參數中實現?
C++ std::set 的實現中對於iterator的這個強制轉換是如何進行的?
C# 為什麼去掉了C++中頭文件的概念?
如何使用C++編寫一個模板,可以同時適用於數組和vector<int>類型且避免數據的複製?

TAG:STL | C |