gpt4 book ai didi

c++ - Visual C++ 编译器为不明确的符号提供了错误的行引用

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:26 34 4
gpt4 key购买 nike

代码如下:

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 , 它说

If name lookup finds a declaration for a name in two different namespaces, and the declarations do not declare the same entity and do not declare functions, the use of the name is ill-formed....

然后它给出了一个类似于你的例子,像这样:

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 都接受代码。我认为他们在这里错了。

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

在您的代码中, namespace n1 中的名称 n2 是函数模板,而不是函数。因为,函数模板不是函数。参见 $8.3.5.15 (强调我的):

A non-template function is a function that is not a function template specialization. [ Note: A function template is not a function. — end note ]

要解决您的问题,请使用全局命名空间来限定 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 */
{

}

关于c++ - Visual C++ 编译器为不明确的符号提供了错误的行引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36644566/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com