0
我想下面简单的事情行使ADL错误实例化函数模板
namespace test{
struct S{ public: s():a(10){} int a;};
template<typename T>
void fun(S o){
T a{};
std::cout<<(a+o.a)<<"\n";
}
}
int main(){
test::S A;
fun<int>(A);
}
error1: expected primary-expression before ‘int’
fun<(int)>(A);
error2:'fun’ was not declared in this scope
fun<int>(A);
的,我不知道的第一个错误的行为(有它任何处理C++伤脑筋解析?),并为第二个错误,因为我已经通过类型S
类型的参数我相信ADL会考虑S
及其关联的namespace test
,但不知道为什么我得到'fun’ was not declared
错误。
好的尝试,但我想你错过了问题的关键。 C++中有一个称为ADL的功能,它会使这个变得不必要,问题在于ADL没有在给定的代码中被触发。 –
@Tomas Dittmann我很欣赏你的答案,但我遇到了这个“ADL通过在名称空间和类中查找与名称空间和类相关联的名称”来调用参数的类型。给出了这些关联的名称空间和相关类的精确 定义后来,但直观上他们可以被认为是所有命名空间和类,直接连接到一个给定的类型。“ –
啊我从来没有听说过ADL。现在就阅读它。通过给出错误的答案来学习...... –