2016-10-09 89 views
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错误。

回答

-1

您在测试命名空间中放置了乐趣<>。

所以称之为测试::乐趣

+2

好的尝试,但我想你错过了问题的关键。 C++中有一个称为ADL的功能,它会使这个变得不必要,问题在于ADL没有在给定的代码中被触发。 –

+0

@Tomas Dittmann我很欣赏你的答案,但我遇到了这个“ADL通过在名称空间和类中查找与名称空间和类相关联的名称”来调用参数的类型。给出了这些关联的名称空间和相关类的精确 定义后来,但直观上他们可以被认为是所有命名空间和类,直接连接到一个给定的类型。“ –

+0

啊我从来没有听说过ADL。现在就阅读它。通过给出错误的答案来学习...... –