以下代码片段无法在 MSVC 18.00.31101 中编译并出现以下错误,但在 gcc 4.9.2 和 clang 3.6.0 中成功。限定参数类型或在声明中包含 struct 关键字可解决错误。这是编译器错误还是未定义的行为?
#include <cstdlib>
struct A {
int B;
};
struct Snap {
template<size_t TSize>
Snap(const A (&)[TSize]) {
// do something with TSize
}
void A() {}
};
int main() {
A pop[] = { {1}, {2}, {3} };
Snap crackle(pop);
return 0;
}
.
1> <...>: error C2664: 'Snap::Snap(const Snap &)' : cannot convert argument 1 from 'A [3]' to 'const Snap &'
1> Reason: cannot convert from 'A [3]' to 'const Snap'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
最佳答案
这是格式错误的,但不需要诊断。 [basic.scope.class]/p1:
在其上下文中评估的名称 A
指的是 ::A
,但在 Snap::A
的完整范围内重新评估时指的是 Snap
。
关于c++ - 由于成员函数与参数类型的名称冲突,模板构造函数在 MSVC 中失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29860124/