C++ 为什么允许ADL查找模板名称绑定?
我知道对于依赖名称,绑定必须延迟到实例化点。 考虑以下代码:C++ 为什么允许ADL查找模板名称绑定?,c++,C++,我知道对于依赖名称,绑定必须延迟到实例化点。 考虑以下代码: #include <iostream> using namespace std; template <class T> void g(T a) { f(a); } namespace MyNamespace { class X{}; void f(X) { cout << "f(X)\n"; } } void f(int i) { cout << "f
#include <iostream>
using namespace std;
template <class T>
void g(T a)
{
f(a);
}
namespace MyNamespace
{
class X{};
void f(X) { cout << "f(X)\n"; }
}
void f(int i) { cout << "f(int)\n"; }
int main()
{
g(MyNamespace::X{}); //1. print f(x)
//g(1); //2. not compile
return 0;
}
#包括
使用名称空间std;
模板
无效g(T a)
{
f(a);
}
名称空间MyNamespace
{
类X{};
void f(X){cout在示例1中,因为g()
在全局范围g(MyNamespace::X{});
不调用ADL。
//ff.h
#include <iostream>
namespace N
{
class X {};
int g(X, int i);
}
template<typename T>
double ff(T t, double d)
{
return g(t, d);
}
//ff.cpp
#include "ff.h"
int N::g(X, int i) { std::cout << "g(X,int)" << std::endl; return i; }
double x1 = ff(N::X{}, 1.1);
//main.cpp
#include "ff.h"
namespace N
{
double g(X, double d) { std::cout << "g(X,double)" << std::endl; return d; }
}
auto x2 = ff(N::X{}, 2.2);
int main()
{
extern double x1;
std::cout<<"x1 = " << x1 << std::endl;
std::cout << "x2 = " << x2 << std::endl;
return 0;
}