Полнофункциональный шаблон специализации оператора / из стандартного комплекса не работает, потому что Clang думает, что я хочу сделать частичную специализацию - PullRequest
0 голосов
/ 04 июня 2018

Из-за очень очень длинного списка ограничений и ошибок ... в специальной математической библиотеке, которая использует 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;
}
...