3

这是我在 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 currentPositionvector<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 以获取有关这些错误代码的更多信息,但我无法弄清楚代码有什么问题。有任何想法吗?

4

2 回答 2

7

vector是在命名空间中定义的模板std,因此您应该编写std::vector<int>而不是vector<int>.

using namespace std;或者,您可以在此文件的开头编写,但请注意,这被认为是不好的做法,因为它可能导致您的某些类的名称变得模棱两可。

于 2012-05-24T20:12:39.893 回答
0

您正在使用矢量。Vector包含在命名空间std中。命名空间封装了变量/类的正常范围。如果不以某种方式解析范围,您将无法访问命名空间中的元素。有 3 种主要方法可以解决此问题:

#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 文件中使用它的唯一方法。

于 2016-06-03T17:34:09.297 回答