Один из моих классов объявляют шаблонную функцию:Частичная специализация оператора()
template<class A, class B>
A do_something(const std::vector<B> &data)
, который я хотел бы частично специализироваться на typename A
. B
- это семейство типов, которые реализуют довольно минимальный интерфейс, и мы используем их много, поэтому я бы хотел, чтобы моя специализация была общей на B
. Я подозреваю, что это вдвойне неприятно, так как typename A
используется только как возвращаемый тип.
из Интернета, я подбирала, что я не могу частично специализировать функцию, поэтому я создал класс следующим образом:
template<class A, class B>
class do_something_implementation {
public:
do_something_implementation(const std::vector<B> &data_) {
data = data_;
}
int do_something_implementation<int, B>::operator()() {
/* Complicated algorithm goes here... */
}
double do_something_implementation<double, B>::operator()() {
/* Different complicated algorithm goes here... */
}
private:
std::vector<B> data;
}
Когда я пытаюсь скомпилировать, что (с помощью Visual Studio 2008), происходит сбой компилятора() и я получаю следующее сообщение об ошибке:
fatal error C1001: An internal error has occurred in the compiler.
я предполагаю, что это моя проблема, а не компилятор. Есть ли лучший способ выразить частичную специализацию, к которой я стремился?
Всякий раз, когда компилятор умирает, это проблема с компилятором - неспособность рассказать вам, как неправильно ваш код. В коде есть несколько ошибок, но это не объясняет сообщение «внутренняя ошибка». Конечно, правильная вещь для компилятора будет заключаться в том, чтобы не компилировать код в любом случае ... но он должен обеспечить лучшую диагностику, чем «Я забился до смерти» –
@David: составители компиляторов не являются богами бесплатного программного обеспечения! Это может быть или не может быть «исправлено в более позднем выпуске». –