C++ 实例化函数模板时出错
我正在尝试以下简单的事情来锻炼ADL的行为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);
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——好吧,它发生了:)