C ++ Visual Studio“令人作呕的宏黑客”编译问题

时间:2013-10-31 21:14:02

标签: c++ visual-studio-2012 macros compilation

我正在尝试为自己的理解重新创建矢量类。最近我在尝试编译此代码时遇到了Visual Studio 2013的一个问题。我收到每个'vector'关键字的错误,指出:

enter image description here

我不知道这是否是我班级定义中的范围错误,或者是否是其他内容。我没有使用任何设置。

 #include "../../../std_lib_facilities.h"

    class vector{
        int sz;
        double* elem; //pointer to the first element (of type double)

    public:
        vector(int s) :sz(s), //constructor - allocates s doubles , :size(s) is a 'initilization list'
            elem(new double[s])
        {
            for (int i = 0; i < s; i++)
                elem[i] = 0; //initialize elements

        }

        int size() const
        {
            return sz;
        }

        //read
        double get(int n)
        {
            return elem[n];
        }

        //write
        void set(int n, double v)
        {
            elem[n] = v;
        }


        //Every class that owns a resource needs a destructor
        ~vector() //destructor
        {
            delete[] elem; // free memory
        }

    };


    int main(int argc)
    {
        vector v(5);
        for (int i = 0; i < v.size(); i++){
            v.set(i, i);
            cout << "v[" << i << "]==" << v.get(i) << '\n';
        }
        system("PAUSE");

    }

如果您需要更多信息,请不要犹豫。

2 个答案:

答案 0 :(得分:1)

在线搜索时,我发现您的header file ...包含以下行:

// disgusting macro hack to get a range checked vector:
#define vector Vector

我不知道你为什么使用它,但这是你问题的原因。

要使用矢量,您需要做的只是#include <vector>

要添加一些说明,头文件会创建一个名为Vector的矢量类,然后#define会确保vector的所有初始化实际上都会引用此Vector类。

重命名你的课程将为你解决这个问题。

作为旁注,该头文件很可怕,使用时要小心。

答案 1 :(得分:1)

我假设this是你所包含的std_lib_facilities.h。该文件包含一个宏

// disgusting macro hack to get a range checked vector:
#define vector Vector

这会导致代码中vector的所有后续出现都被Vector替换。因此,当您声明class vector时,它会更改为class Vector,并且由于您包含的标头已经声明了名为Vector的模板类型,因此您可能会收到重新定义的符号错误。另外,在main声明vector v(5);时,它会更改为Vector v(5),并且由于Vector中声明的原始std_lib_facilities.h类需要模板参数,因此会出现错误在您的问题中发布有关缺少模板参数的消息。

要解决这个问题,您可以将您的课程重命名为vector之外的其他内容,然后在#undef vector之后添加std_lib_facilities.h,或者根本不能包含该标题{ {1}}因为您使用的标准库的唯一部分是#include <iostream>