【问题标题】:how to port CArray (MFC) to linux如何将 CArray (MFC) 移植到 linux
【发布时间】:2023-06-29 23:21:01
【问题描述】:

我正在将一个 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 等价物的工作,请提供解决方案。

【问题讨论】:

  • 我检查了这个链接*.com/questions/3097445/vector-of-double2-error 将这两个值放入结构中,然后在向量中使用。
  • 您不需要 两个 值,MFC 中的CArray 类使用一个模板参数存储数据,另一个用于函数参数。如果您检查CArray reference,您甚至会看到第二个模板参数默认为第一个。使用std::vector&lt;double&gt; 就足够了。

标签: c++


【解决方案1】:

您需要将结构设为非本地类型:

#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++ 中受益,而不是使用 struct 来保存一对值,并使用 std::pair

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

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

int main ()
{
    
    CArray min;
    CArray max;
    return 0;
}

【讨论】:

    【解决方案2】:

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

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

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

    当然,问题是问题是错误的:这应该是为什么你需要一个结构和两个double 值在你的std::vector 中?毕竟,您向我们展示的CArray 不包含两个double 值。它拥有一个,所以std::vector&lt;double&gt; 应该可以解决问题。当您尝试移植此代码时,您可能会发现 documentation for CArray 很有帮助。

    【讨论】:

      【解决方案3】:

      MFC 的 CArray&lt;double,double&gt; 的 STL 等价物就是 std::vector&lt;double&gt;

      【讨论】: