2015-11-18 161 views
0

我想在OSX Yosemite下创建一个关键字识别子例程,参见下面的清单。我确实有一些奇怪的事情。结构向量的C++初始化

我正在使用“操场”来制作MWE,并且项目的构建看起来不错,但不想运行: “我的Mac运行OS X 10.10.5,它低于String sort的最低部署目标。 “ 我甚至不明白这条消息,特别是我的代码在排序时没有做什么。

然后,我将相关代码粘贴到我的应用程序中,在该应用程序中使用CMake生成项目,同一配置中的相同编译器和相同IDE以消息 显示“非聚合类型”矢量用“vector QInstructions = {..}”结构中的初始化程序列表“ ”进行初始化。

当搜索类似的错误消息时,我发现了几个类似的问题,并且建议的解决方案使用默认构造函数,手动初始化等。我想知道标准抗压缩初始化是否可行?

#include <iostream> 
using namespace std; 
#include <vector> 

enum KeyCode {QNONE=-1, 
    QKey1=100, QKey2 
}; 

struct QKeys 
{  /** The code command code*/ 
    std::string Instr; ///< The command string 
    unsigned int Length; ///< The significant length 
    KeyCode Code; // 
}; 

vector<QKeys> QInstructions={ 
{"QKey1",6,QKey1}, 
{"QKey2",5,QKey2} 
}; 

KeyCode FindCode(string Key) 
{ 
    unsigned index = (unsigned int)-1; 
    for(unsigned int i=0; i<QInstructions.size(); i++) 
     if(strncmp(Key.c_str(),QInstructions[i].Instr.c_str(),QInstructions[i].Length)==0) 
     { 
      index = i; 
      cout << QInstructions[i].Instr << " " <<QInstructions[i].Length << " " << QInstructions[i].Code << endl; 
      return QInstructions[i].Code; 
      break; 
     } 
    return QNONE; 
} 

int main(int argc, const char * argv[]) { 

    string Key = "QKey2"; 
    cout << FindCode(Key); 
} 
+1

请确保您的建筑物为C++ 11而非C++ 98. –

+0

游乐场?据我所知,游乐场是一个迅速的功能。 – molbdnilo

回答

-1

最后,我找到了正确的解决方案为 Initialize a vector of customizable structs within an header file。不幸的是,替换括号并没有帮助。

关于使用-1设置的unsigned int到其最高可能值,我觉得是矫枉过正使用std::numeric_limits<unsigned int>::max()这种情况下,是一种过度的标准化。我个人认为,只要我们使用二进制补码表示,分配就是正确的。例如,在 http://www.cplusplus.com/reference/string/string/npos/ 你可以读取:

静态常量size_t型非营利组织= -1;

...

非营利组织是与size_t类型的元件的最大可能值 的静态成员的恒定值。

...

此常数为-1的值,这是因为为size_t是 一个无符号整数类型定义,它是这种类型的最大可能的可表示 值。

2

在代码

vector<QKeys> QInstructions={ 
("QKey1",6,QKey1), 
{"QKey2",5,QKey2} 
}; 

数据的第一行,使用括号 “()”。将它们替换为“{}”赞誉,它将起作用。我看你写了unsigned index = (unsigned int)-1;。根据标准,这是未定义的行为。这也是不好的,因为你使用的是C风格的演员(见here)。你应该将其替换为:

unsigned index = std::numeric_limits<unsigned int>::max();