这是我在Visual C ++ Express 2010中正在处理的类的标题:
/* custom class header to communicate with LynxMotion robot arm */
#include <vector>
using namespace System;
using namespace System::IO::Ports;
public ref class LynxRobotArm
{
public:
LynxRobotArm();
~LynxRobotArm();
void connectToSerialPort(String^ portName, int baudRate);
void disconnectFromSerialPort();
void setCurrentPosition(int channel, int position);
int getCurrentPosition(int channel);
void moveToPosition(int channel, int position);
private:
void initConnection();
SerialPort^ serialPort;
array<String^> ^serialPortNames;
String^ portName;
int baudRate;
vector<int> currentPosition;
};
在将最后一行int currentPosition
更改为vector<int> currentPosition
之前,一切正常。如果我现在尝试编译/调试,我会收到以下错误消息:
error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
我查了MSDN以获取有关这些错误代码的更多信息,但我无法弄清楚代码有什么问题。有什么想法吗?
答案 0 :(得分:7)
vector
是在std
命名空间中定义的模板,因此您应该编写std::vector<int>
而不是vector<int>
。
或者您可以在此文件的开头写using namespace std;
,但请注意,这被视为不良做法,因为它可能会导致您的某些类名称变得模棱两可。
答案 1 :(得分:0)
您正在使用矢量。 Vector包含在命名空间std中。命名空间封装了变量/类的正常范围。如果不以某种方式解析范围,则无法访问命名空间中的元素。有三种主要方法可以解决这个问题:
#include <vector>
using namespace std;
你通常不想使用这个,它会产生问题,因为它允许你看到命名空间std中包含的任何函数/类。这必然会导致命名冲突。
下一步是:
#include <vector>
using std::vector;
这种方式好一点。它使矢量对文件中的任何内容或包含所述文件的任何文件都可见。它在.cpp文件中可能是完全无害的,因为你不应该包括.cpp文件。而且你应该知道你是什么符号。在.h / .hpp文件的场景中,您可能仍然不想使用它。任何包含其源代码的.hpp文件的文件都会将类向量视为名称定义。这可能对您的代码用户不利,因为他们可能不期望定义该符号。对于hpp文件,您应始终使用以下内容:
#include <vector>
class myClass{
private:
std::vector myVector;
};
以这种方式使用命名空间可以确保它只能在符号使用的地方准确显示,而不是其他地方。这是我在.hpp文件中使用它的唯一方法。