C++ 操作员/来自std复合体的全功能模板专门化不起作用,因为clang认为我想进行部分专门化

C++ 操作员/来自std复合体的全功能模板专门化不起作用,因为clang认为我想进行部分专门化,c++,function-templates,C++,Function Templates,由于一个非常长的约束和陷阱列表。。。在我试图扩展的一个使用libc++(以及其他情况下使用libstdc++)的特殊数学库中,我试图完全专门化函数,因为在libc++中,它使用的函数如scalbn和logb在本例中不适用于所讨论的类型a。对于libstdc++,这并不重要,因为这些函数没有被调用。下面是一个触发我遇到的错误消息的最小案例。通过查看-E输出,我不清楚是什么其他基本模板(可能有更多参数)导致了此消息,尽管libstdc++也会出现这种情况。是的,我意识到我不应该在标准名称空间中定义东

由于一个非常长的约束和陷阱列表。。。在我试图扩展的一个使用libc++(以及其他情况下使用libstdc++)的特殊数学库中,我试图完全专门化函数,因为在libc++中,它使用的函数如
scalbn
logb
在本例中不适用于所讨论的类型
a
。对于libstdc++,这并不重要,因为这些函数没有被调用。下面是一个触发我遇到的错误消息的最小案例。通过查看
-E
输出,我不清楚是什么其他基本模板(可能有更多参数)导致了此消息,尽管libstdc++也会出现这种情况。是的,我意识到我不应该在标准名称空间中定义东西。是的,我知道ADL能够引入名称空间,作为一种防止在std以及其他技术中定义事物的方法。这不是我想在这里做的。谢谢你能给我的帮助

#include <complex>
#include <iostream>

template <class T> struct A{ T a; };

namespace std{
//template <>  // if uncommented, warning: extraneous template parameter list in template specialization
template <class T>
inline std::complex<A<T>>
operator/ <A<T>> (  // either way, error: function template partial specialization is not allowed
 std::complex<A<T>> const&,
 std::complex<A<T>> const&) {
 std::cerr<<"full explicit specialization called\n";
 return std::complex<A<T>>();
}
}

int main(int,char*[]){
 A<double> myA{10};
 A<double> myOtherA{5};
 std::complex<A<double>> r(std::complex(myA)/std::complex(myOtherA));
 std::cerr<<r.real().a<<"\n";
 return 0;
}
#包括
#包括
模板结构A{ta;};
名称空间标准{
//模板//如果未注释,则警告:模板专用化中的无关模板参数列表
模板
内联std::complex
运算符//(//无论哪种方式,错误:不允许函数模板部分专用化
std::复数常量&,
std::复数常量&){

通常,在大多数情况下,.您特别要做的是UB,因为除了
float
double
long double
之外,不允许为类型实例化
std::complex
,但如果取消了该限制,
操作符的专门化将非常好。(是的,我知道这不是你问题的重点,但这可能是一个有用的观察。)我很久以前就考虑过这一点,但我决定不让实现对于通常使用std::complex的类型是不对称的。这个东西与Eigen接口,在与std::complex相关的许多其他功能中,它返回std::complex类型的矩阵的特征向量,如果输入矩阵是类型a。同样,在m中在实际实施中,我在std中添加了许多模板,在编写描述时很难只记住示例。Hrm,我不确定这在完整版本中是否适用,但我只是想出了一个主意,使用更受约束的基本模板,而不是模板专门化