【问题标题】:'Concurrency': a namespace with this name does not exist'并发':具有此名称的命名空间不存在
【发布时间】:2019-01-21 21:55:09
【问题描述】:

我是一名业余 C# 程序员,由于需要 C++ AMP 技术来处理一些繁重的数字运算,因此误入了 C++。因此,我的 C++ 编程技能还没有得到很好的发展。

在我第一次尝试实际程序时,我选择了基于Daniel Moth's April 2012 article 的代码。我无法建造它。我总是得到错误:

C2871“并发”:具有此名称的命名空间不存在。

我知道代码最初是为 Visual Studio 11 编写的,但我的机器上只有 VS 2008 和 VS 2010。所以,我安装了 VS 2017(版本 15.9.4,.Net 4.7.03062)。我从一个空的 C++ 项目开始,但遇到了麻烦。在我完成了它无法识别的所有事情之后,我能做的最好的事情就是一个错误:

C3861:未找到“访问”标识符,文件“amp.h”中的第 2616 行。

所以我又开始了,这次是一个空的 Windows 控制台应用程序项目。同样,我不得不大幅调整代码以从 Visual Studio 11 迁移到 VS 2017,但最终得到的代码如下所示。

我尽我所能找到错误的根源。我同时针对 x64 和 x86,但没有任何区别。我注释掉了第 5 行和第 21-27 行,代码将构建并执行。 IntelliSense 没有显示任何问题,无论是标识符还是语法。事实上,鼠标悬停信息识别出Concurrency 结构。我故意拼错了Concurrency,但 IntelliSense 立即发现了这一点。我查看了项目属性,着眼于需要更改以运行 AMP 的设置,但由于我什至不确定我在寻找什么,所以我什么也没找到。

我试图找到定义Concurrency 的文件的名称,以便我可以搜索我的机器以查看它是否存在,如果存在则添加路径,但未成功。我什至找不到文件名。我用谷歌搜索并仔细研究了在线资源和 MS Docs,但无论我如何表达我的搜索问题,我都没有找到任何答案。

错误提示:

并发不存在

这对我来说意味着它找不到它,它不在机器上,或者某些构建设置阻止它被使用。大多数关于编写 AMP 代码的在线文章都没有提到构建设置。它不需要与串行编码项目不同的东西吗?它就像缺少参考一样简单吗?如果是这样,我在哪里可以找到它?以我有限的经验,我不知道还能尝试什么。

我的机器是 Win 7 SP1 机器。 KB2999226 错误修复已安装。我没有安装所有的 VS 2017,因为我只对 C# 和 C++ 感兴趣。我没有安装我应该安装的东西吗?

如果这个问题以前解决过,我找不到。因此,任何帮助将不胜感激。

1.   #include <amp.h>
2.   #include "pch.h"
3.   #include <iostream>
4.   #include <vector>
5.   using namespace Concurrency;
6.   
7.   int main() {
8.       const int M = 1024; const int N = 1024;            //row, col for vector 
9.       std::vector<int> vA(M*N); std::vector<int> vB(M*N); //vectors to add
10.      std::vector<int> vC(M*N);                          //vector for result
11.   
12.      for (int i = 0; i < M; i++) { vA[i] = i; }         //populate vectors
13.      for (int j = N - 1; j >= 0; j--) { vB[j] = j; }
14.   
15.      for (int i = 0; i < M; i++) {                      //serial version of
16.          for (int j = 0; j < N; j++) {                  //matrix addition
17.              vC[i*N + j] = vA[i*N + j] + vB[i*N + j];   //using vectors
18.          }
19.      }
20.   
21.      extent<2> e(M, N);                         //uses AMP constructs but no
22.      array_view<int, 2> a(e, vA), b(e, vB);     //parallel functions invoked
23.      array_view<int, 2> c(e, vC); 
24.      index<2> idx(0, 0);
25.      for (idx[0] = 0; idx[0] < e[0]; idx[0]++) {
26.          for (idx[1] = 0; idx[1] < e[1]; idx[1]++) {
27.              c[idx] = a[idx] + b[idx];
28.          }
29.      }
30.  // C2871   'Concurrency': a namespace with this name does not exist.  Line 5
31.  // Also C2065, C3861, C2062 for all Concurrency objects    Line 21 - Line 27
32.  }
33. 

【问题讨论】:

  • 文章使用using namespace concurrency;。注意小写的c
  • 我尝试了两种拼写,大写 C,小写 c。没有区别。我将其保留为大写,因为智能感知信息使用了大写版本。
  • 感谢 Kashif R 的编辑。它更容易阅读和理解。
  • @RickSmith 是正确的:我需要问一个不同的问题。
  • 仅供参考,我将源代码放在 VS Express 2015、Ver 14 Update 3、Win32、X86 的项目中。我不得不将"pch.h" 更改为"stdafx.h",但编译时没有错误。运行(调试)时,它以代码0 退出,但出现许多警告。

标签: c++-amp concurrency-runtime


【解决方案1】:

与,

#include "amp.h"
#include "pch.h"
#include <iostream>
using namespace concurrency;

我明白了,

C2871   'concurrency': a namespace with this name does not exist

然而,与,

#include "pch.h"
#include <iostream>
#include "amp.h"
using namespace concurrency;

没有错误。

我建议移动#include "amp.h",如图所示。

我还使用了concurrencyConcurrency。没有区别。


对于错误C3861: ‘access’ identifier not found, line 2616 in file ‘amp.h’.

从菜单中选择Project,然后选择Properties

Property Pages 窗口的C/C++ 下,选择All Options,然后选择Conformance mode

Yes (/permissive-) 更改为No。选择OK

构建项目并运行。

默认情况下,/permissive- 选项在由 Visual Studio 2017 版本 15.5 及更高版本创建的新项目中设置。在早期版本中默认未设置。设置该选项后,当在您的代码中检测到非标准语言结构(包括 C++11 之前代码中的一些常见错误)时,编译器会生成诊断错误或警告。

更多信息可以在here找到。

在我看来,这表明"amp.h" 不符合对 C++ 15.5 所做的更改。因此,它在 VS 2015 14.0(更新 3)中使用 C++,然后在 VS 2017 15.9.5 中使用 C++ 失败。

【讨论】:

  • 我根据您的建议重新排序了#include "amp.h"。而不是 C2871,我得到了一个 C3861:找不到“访问”标识符,文件“amp.h”中的第 2616 行
  • 问题出在第 27 行,c[idx] = a[idx] + b[idx];。注释掉时,没有错误。我一直无法确定问题所在。我建议您就C3861 将其链接到此问题提出一个新问题,但是,在发布代码时,不要包含行号。这将使其他人更容易提供帮助。 (“粘贴”完代码后,选中代码,然后按Ctrl+K识别为代码。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 1970-01-01
  • 2019-04-02
  • 1970-01-01
相关资源
最近更新 更多