namespace N
{
struct A {};
template <typename T>
double operator+ (T a, double d) {return d;}
template <typename T>
double operator+ (double d, T a) {return d;}
}
void test()
{
N::A a;
double x;
double y = a + x;
double z = x + a;
}
依我看来,名称空间N
中的模板化operator+
应该由ADL(通过参数相关性查找)得到。
为什么clang
不同意?这是clang
的一个bug还是其他编译器的问题?
以下是来自clang 3.5.1的编译错误信息(在coliru上测试),我不明白出了什么问题...
10 : error: overloaded 'operator+' must have at least one parameter of class or enumeration type
double operator+ (double d, T a) {return d;}
^
18 : note: in instantiation of function template specialization 'N::operator+' requested here
double y = a + x;
^
7 : error: overloaded 'operator+' must have at least one parameter of class or enumeration type
double operator+ (T a, double d) {return d;}
^
19 : note: in instantiation of function template specialization 'N::operator+' requested here
double z = x + a;
^
2 errors generated.
Compilation failed
这个例子是从真实代码简化而来。意图是在命名空间N中定义的任何类都有一个重载的operator+方法,可以与double相加。
x
未初始化。 - Kerrek SB