Visual C ++编译器为歧义符号提供错误的行引用

拉兹沃德

代码如下:

namespace n1
{
    template <class T>
    void n2();

    template <class T>
    void n2(T);
}

namespace n2 /* line 12 */
{
    class c {};
}

using namespace n1;

namespace n3
{
    void foo(n2::c);
}

void n3::foo(n2::c) /* line 24 */
{

}

尝试使用最新版本的Visual C ++进行编译时,出现以下错误:

1>test.cpp(24): error C2872: 'n2': ambiguous symbol
1>test.cpp(12): note: could be 'n2'
1>test.cpp(24): note: or       'n2'

在前面的代码段中,第12行和第24行带有注释。

这里发生了什么?如果我删除foo的定义并在函数参数列表之外声明类型为n2 :: c的变量,则它可以很好地编译,我认为这是因为编译器发现我是在引用该类,而不是在引用任何模板函数。另外,如果我改为删除命名空间n1中两个n2模板函数的第二个定义,那么编译器会给我一条错误消息,但要引用正确的行:第12行和其中n2被定义为函数的行(而不是第24行) )。这是编译器错误吗?

怀念

我认为微软在这里是正确的。引用工作中的C ++标准草案$ 7.3.4.6,它说

如果名称查找在两个不同的命名空间中找到名称的声明,并且声明未声明相同的实体且未声明函数,则名称的使用格式不正确。

然后给出一个类似于您的示例,如下所示:

namespace A {
  class X { };
  extern "C"   int g();
  extern "C++" int h();
}
namespace B {
  void X(int);
  extern "C"   int g();
  extern "C++" int h(int);
}
using namespace A;
using namespace B;

void f() {
  X(1);             // error: name X found in two namespaces
  g();              // OK: name g refers to the same entity
  h();              // OK: overload resolution selects A::h
}

虽然,gcc和clang都接受代码。我认为他们在这里错了。

返回引用的段落,并注意“ ...不要声明相同的实体,不要声明函数... ”行。

在您的代码中,名称n2空间中的名称n1是函数模板而不是函数。因为,功能模板不是功能。参见$ 8.3.5.15(重点是我的):

非模板功能是不是功能模板专门化的功能。[注意:功能模板不是功能。—尾注]

要解决您的问题,请n2使用全局命名空间进行限定...像这样

namespace n1
{
    template <class T>
    void n2();

    template <class T>
    void n2(T);
}

namespace n2 /* line 12 */
{
    class c {};
}

using namespace n1;

namespace n3
{
    void foo(::n2::c);
}

void n3::foo(::n2::c) /* line 24 */
{

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Visual C ++报告非歧义类的歧义符号错误

Visual Studio 2013和2015中的C ++编译器错误C2280“试图引用已删除的函数”

Visual Studio 2015 C ++编译器可能提供代码内指令集标记

Visual Studio 2013中可能的C / C ++编译器错误

在C ++程序中使用libcurl会导致Visual C ++编译器发出错误

如何使用Visual c ++编译器为Boost 1.39.0构建库运行Cmake

什么是 ?和@符号表明此编译器错误?-Visual Studio 2013编译器

也许是Visual Studio 2015中的C#编译器错误

Visual Studio 2015更新3-C ++编译器错误?

在Visual C ++ 2010编译器的code :: block中使用小部件库时,发生错误

可能的Visual Studio 2015 C ++编译器和IntelliSense错误

Visual Studio 2015更新1中C ++的内部编译器错误

在Visual C ++下使用模板特化时的编译器错误

仅在发行版中的Visual Studio 2019“ C1001内部编译器错误”

是否应该在Visual Studio C#编译器中将此列表初始化器行为报告为错误?

如何获取MatLab来查找Visual C ++编译器?

使用Visual Studio编译器分析内联的C ++函数

CMake找不到Visual C ++编译器

C ++:使用Visual Studio编译器时的const指针

Visual Studio C ++编译器怪异行为

拆解Visual Studio Intel编译器C ++代码

Visual C ++编译错误

g ++编译器为表达式提供<<类型错误,但可在Visual Studio中使用

Visual Studio C++ 编译器尝试编译 CUDA C/C++ 文件

在编译器 c++ FreeBSD 上错误未定义对符号“FCGX_InitRequest”的引用

C编译器错误:函数的未定义引用

如何使用 Visual Studio 编译器在 Windows 上编译 cython 编译的 c 代码

用MinGW或其他C ++编译器模仿Visual C ++(对于基于Visual C ++的Python包)

哪些编译器选项用于在Visual Studio中编译C ++ STL类/函数?