為什麼不能在 std::map 中使用局部類型?
我要定義一個map
為什麼這個結構體要定義成全局變數,才能編譯通過。如果放到main函數中就報錯呢?
typedef struct ZkStruct
{
int x;
char s[20];
} ZkStruct;
map&zkmap;
@藍木達 大嬸的關注點才對嘛。
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&
return 0;
}
編譯通過,毫無問題。
推薦閱讀:
※如何評價 JetBrains 的新 C/C++ IDE CLion?
※C++ unordered_map 中 double 作key如何在模板參數中實現?
※C++ std::set 的實現中對於iterator的這個強制轉換是如何進行的?
※C# 為什麼去掉了C++中頭文件的概念?
※如何使用C++編寫一個模板,可以同時適用於數組和vector<int>類型且避免數據的複製?