1

我正在将 Windows 应用程序移植到 linx。我正在尝试将 CArray MFC 方法移植到 linux。要移植的 CArray 是

CArray<double,double> min;

我做了一个类似的东西......

#include <iostream>
#include <vector>
#include <list>

int main ()
{
        struct values
        {
            double value1;
            double value2;
        };
        typedef std::vector<values> CArray;
        CArray min;
        CArray max;
    return 0;
}

但我越来越像...

vec1.cpp: In function ‘int main()’:
vec1.cpp:12:29: error: template argument for ‘template<class _Alloc> class std::allocator’ uses local type ‘main()::values’
vec1.cpp:12:29: error:   trying to instantiate ‘template<class _Alloc> class std::allocator’
vec1.cpp:12:29: error: template argument 2 is invalid
vec1.cpp:12:37: error: invalid type in declaration before ‘;’ token

如果有人在将 CArray 移植到 linux 等价物上工作,请提供解决方案。

4

3 回答 3

4

您需要使您的 struct 非本地类型:

#include <iostream>
#include <vector>
#include <list>

struct values
{
   double value1;
   double value2;
};

int main ()
{
        typedef std::vector<values> CArray;
        CArray min;
        CArray max;
    return 0;
}

但是,您应该从 C++ 中受益并使用std::pair ,而不是使用 struct 来保存一对值:

#include <iostream>
#include <vector>
#include <list>
#include <utility>

typedef std::vector<std::pair<double, double> > CArray;

int main ()
{
    
    CArray min;
    CArray max;
    return 0;
}
于 2013-04-26T08:45:13.493 回答
2

第一行error描述了问题所在:

template argument for ‘template<class _Alloc> class std::allocator’ uses local type ‘main()::values’

现在,让我们想想……如果编译器抱怨对valuesmain 来说是本地的,我们该如何解决呢?我们可以,也许values不是本地的主要?因此,您正在寻找的答案是将声明移到valuesmain 和全局范围之外。

当然,问题在于问题是错误的:这应该是为什么你需要一个结构和两个double值在你的std::vector? 毕竟,CArray你向我们展示的不包含两个double值。它拥有一个,所以std::vector<double>应该做到这一点。当您尝试移植此代码时,您可能会发现文档很有帮助。CArray

于 2013-04-26T08:46:13.873 回答
2

MFC 的 STL 等价物CArray<double,double>就是std::vector<double>.

于 2013-04-26T09:21:14.733 回答