C++ 实例化函数模板时出错

C++ 实例化函数模板时出错,c++,templates,C++,Templates,我正在尝试以下简单的事情来锻炼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);

我正在尝试以下简单的事情来锻炼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);
名称空间测试{
结构S{public:S():a(10){}inta;};
样板
虚无乐趣(S o){
T{};
std::cout您在测试名称空间中添加了乐趣


这样用测试::FooP

好的尝试,但是我认为你错过了问题的要点。C++中有一个特性,叫做ADL,它会使这不必要,问题是为什么在给定的代码中没有触发ADL。ADL继续在名称空间和类中查找与调用参数类型“关联”的名称。这些关联名称空间和关联类的精确定义将在后面给出,但直观地说,它们可以被认为是与给定类型直接关联的所有名称空间和类。“啊,我从来没有听说过ADL。现在只是在读它。通过给出错误的答案来学习…@TomasDittmann——好吧,它发生了:)