C++;使用声明和参数相关查找 是有效C++ 98以下的代码,还是需要一个更新版本的C++标准?< /P> namespace basic { void f(int) {} } namespace lib { template<class T1, class T2> void g(T1 x1, T2 x2) { using basic::f; // pull in function f for basic types without ADL f(x1); f(x2); // error: no suitable conversion function from "user::c" to "int" exists } } namespace user { class c {}; void f(c) {} } int main() { lib::g(1, user::c()); } namespace-basic { 空f(int){} } 名称空间库 { 模板 空隙g(T1-x1,T2-x2) { 使用basic::f;//为没有ADL的基本类型引入函数f f(x1); f(x2);//错误:不存在从“user::c”到“int”的合适转换函数 } } 命名空间用户 { c类{}; 空f(c){} } int main() { lib::g(1,user::c()); } 显然,我的编译器(基于EDG前端,我猜)在使用Basic::f之后不考虑用户::f。根据C++98,这是正确的行为吗?

C++;使用声明和参数相关查找 是有效C++ 98以下的代码,还是需要一个更新版本的C++标准?< /P> namespace basic { void f(int) {} } namespace lib { template<class T1, class T2> void g(T1 x1, T2 x2) { using basic::f; // pull in function f for basic types without ADL f(x1); f(x2); // error: no suitable conversion function from "user::c" to "int" exists } } namespace user { class c {}; void f(c) {} } int main() { lib::g(1, user::c()); } namespace-basic { 空f(int){} } 名称空间库 { 模板 空隙g(T1-x1,T2-x2) { 使用basic::f;//为没有ADL的基本类型引入函数f f(x1); f(x2);//错误:不存在从“user::c”到“int”的合适转换函数 } } 命名空间用户 { c类{}; 空f(c){} } int main() { lib::g(1,user::c()); } 显然,我的编译器(基于EDG前端,我猜)在使用Basic::f之后不考虑用户::f。根据C++98,这是正确的行为吗?,c++,argument-dependent-lookup,using-declaration,C++,Argument Dependent Lookup,Using Declaration,我认为这不是编译器的正确行为。您的模板应该仅在声明使用点之后才进行实际解析/实例化。因此,在这一点上,它应该解析该实例化的名称,这些名称包括ADL拉入查找,所以这应该是有效的 我认为MSVC仍然有一个悬而未决的事情要做这两个阶段的查找,你的编译器(EDG前端?编译器的名字是什么)也可以做这件事。我知道MSVC2015没有进行适当的两阶段查找,但我不确定这是否适用于此示例,您的意思是您没有使用该编译器。它可以用g++编译:编译器的名称是Wind River Diab编译器版本5.5。不能因为他们出

我认为这不是编译器的正确行为。您的模板应该仅在声明使用点之后才进行实际解析/实例化。因此,在这一点上,它应该解析该实例化的名称,这些名称包括ADL拉入查找,所以这应该是有效的


我认为MSVC仍然有一个悬而未决的事情要做这两个阶段的查找,你的编译器(EDG前端?编译器的名字是什么)也可以做这件事。我知道MSVC2015没有进行适当的两阶段查找,但我不确定这是否适用于此示例,您的意思是您没有使用该编译器。

它可以用g++编译:编译器的名称是Wind River Diab编译器版本5.5。不能因为他们出错而责怪他们Visual Studio 2015也会出错。。。虽然像这样大的公司居然不支持完整的C++98,这是一件很遗憾的事,但这并不是指现在不推荐使用的部件。