Я пытаюсь написать класс арифметики с фиксированной точкой, где позиция точки и базовый тип являются шаблонами
template <int P, typename T>
class basic_fixedpoint{
//stuff
};
Я также хочу показать один шаблонный неявный конструктор, который затем специализируется для различных типов
//inside basic_fixedpoint
template <typename U>
basic_fixedpoint(const U& arg);
В других местах я буду реализовывать специализации для int, float, double и т. Д. Однако я также хочу предоставить общую специализацию для любого типа basic_fixedpoint с различными P и T. Как я могу сделать это как шаблонную специализацию шаблона?
template <int P, typename T> //for the class whose constructor i specialize
template <int OP, typename OT> //for the parameters of the argument
basic_fixedpoint<P, T>::basic_fixedpoint<basic_fixedpoint<OP, OT> >(const basic_fixedpoint<OP, OT>& arg)
: /*init things here*/ {} // this fails
Я пытаюсь избежать перегрузки конструктора, чтобы представить один интерфейс в заголовке, говоря пользователю «Этот класс будет чисто конструировать себя из любого типа, который вы ему дадите, или он не сможет скомпилироваться и даст вам непонятный абзац долго сообщение об ошибке»
В качестве дополнительного вопроса: этот класс также реализует базовые операторы int (), операторы float (), операторы double (), а также перегруженные арифметические операторы и математические функции. Естественно, всякий раз, когда я пытаюсь вызвать что-либо с этим классом, вызов неоднозначен, потому что каждая возможность доступна.
Как я могу сохранить этот класс полностью гибким, но при этом разрешить безболезненные однозначные перегруженные вызовы функций, которые ведут себя правильно (вместо того, чтобы всегда преобразовывать мой класс в double и обратно)?
Я думаю, что вы можете пересмотреть то, что вы действительно хотите. Неявные преобразования — это не всегда хорошая идея (чаще всего это плохая идея), а класс, который может быть неявным образом преобразован в одни и те же типы, всегда плохая идея (это приведет к ошибкам неоднозначности, когда вы используете этот класс и конвертируемый в / из типа вместе, поскольку это могло пойти обоими путями.
Вы должны вернуться к доске проектирования и решить, что должно быть неявным, а что может быть названный или же явный преобразования.
Кроме того, что касается вашего конкретного вопроса, вы не можете специализировать этот конструктор. Функции (и конструкторы среди них) могут быть только полностью специализированными, и, в частности, вы не можете специализировать шаблонную функцию, которая является членом класса шаблона, без полной специализации шаблона класса. То есть Вы можете специализироваться:
basic_fixedpoint<5,int>::basic_fixed_point<int>(int)
но вы не можете специализироваться:
template <int N, typename T>
basic_fixed_point<N,T>::basic_fixed_point<int>(int)
Как N
а также T
не связаны в этой специализации.
Других решений пока нет …