Вопрос о методе специализации шаблона С++

Я новичок в C++ и пытаюсь использовать шаблон, но у меня проблемы. Что я пытаюсь сделать, так это: попытаться вычислить квадрат числа с использованием шаблона, и число может быть базовым типом данных, таким как int, float, а также комплексными числами. Я также реализовал сложный класс, используя шаблон, и коды следующие:

template <typename T>
class Complex {
public:
  T real_;
  T img_;

  Complex(T real, T img) : real_(real), img_(img) { } 
};

template <typename T>
T square(T num) {
  return num * num;
}

template <>
Complex<typename T> square(Complex<typename T> num) {
  T temp_real = num.real_*num.real_ - num.img_*num.img_;
  T temp_img  = 2 * num.img_ * num.real_;
  return Complex(temp_real, temp_img);
}

Я попытался использовать специализацию шаблона для особого случая, но это дало мне ошибку:

using ‘typename’ outside of template

и ошибка возникает в методе специализации шаблона. Пожалуйста, укажите на мои ошибки. Спасибо.


person Shang Wang    schedule 12.07.2011    source источник
comment
Не ответ, но имейте в виду заголовок <complex>, который, возможно, полностью устраняет необходимость в каком-либо коде.   -  person Kerrek SB    schedule 12.07.2011


Ответы (1)


Похоже, вы пытаетесь частично специализировать шаблоны функций, что на самом деле невозможно в C++. Вместо этого вы хотите просто перегрузить функцию следующим образом:

template<typename T>
T square(T num) // Overload #1
{ 
    return num * num;
}

template<typename T>
Complex<T> square(Complex<T> num) // Overload #2
{
    T temp_real = num.real_*num.real_ - num.img_*num.img_;
    T temp_img  = 2 * num.img_ * num.real_;
    return Complex<T>(temp_real, temp_img);
}

Неформально компилятор всегда будет выбирать перегрузку № 2 вместо перегрузки № 1, когда аргумент имеет тип Complex<T>, потому что это лучшее совпадение.


Другой способ заставить это работать — перегрузить оператор умножения для класса Complex<>, используя определение умножения для комплексные числа. Это имеет то преимущество, что является более общим, и вы можете распространить эту идею на других операторов.

template <typename T>
class Complex
{
public:
    T real_; 
    T img_; 

    Complex(T real, T img) : real_(real), img_(img) {} 

    Complex operator*(Complex rhs) // overloaded the multiplication operator
    {
        return Complex(real_*rhs.real_ - img_*rhs.img_,
            img_*rhs.real_ + real_*rhs.img_);
    }
};

// No overload needed. This will work for numeric types and Complex<>.
template<typename T>
T square(T num)
{
    return num * num;
}

Поскольку вы новичок в C++, я настоятельно рекомендую вам подобрать хороший вводный курс по C++. книга. Шаблоны и перегрузка операторов — не совсем темы для новичков.

person In silico    schedule 12.07.2011