@Airat1995
Студент

Как устранись ошибку с вложенными спецификаторами имени?

Здравствуйте, не могли бы вы мне пожалуйста помочь с решением проблемы? Я создал шаблонный класс, но не могу скомпилировать cpp файл. Компилятор ругается на
nested name specifier 'Vector3<V>::' for declaration does not refer into a class, class template or class template partial specialization
void Vector3 <V>::Cross(const Vector3<V>&multiplicationVector)
~~~~~~~~~~~~~~~^ {

То же относится и к перегрузке операторов
Ниже приведу небольшие куски кода:
Заголовок класса
template <typename V, typename = typename std::enable_if<std::is_arithmetic<V>::value, V>::type>
class Vector3 {
protected:
    V calculateMagnitude();
public:
    Vector3(V _x, V _y, V _z) : x(_x), y(_y), z(_z){};
    V x;
    V y;
    V z;
    /*
     * Analog for dot product
     */
    Vector3<V>& operator +=(const Vector3<V>& addVector);
    /*
     * Analog for dot product, but with minus sign
     */
    Vector3<V>& operator -=(const Vector3<V>& substractVector);
    /*
     * Scalar multiplication operation
     */
    Vector3<V>&operator *=(const int multiplicateNum);
    /*
     * Cross multiplication operation
     */
    void Cross(const Vector3<V>& multiplicationVector);
    /*
     * Return count of available variables
     * Can be used inside function AddDataPointer
     */
    int Size();
    /*
     * Normalize current Vector
     */
    void Normalize();
    /*
     * return current normalized vector, but not change current vector
     */
    Vector3<V> * Normalized();
};

И исполнительный файл. Здесь лишь указаны примеры из того, как я прописывал метод и перегрузку операторов
template <class V>
V &Vector3<V>::operator+=(const Vector3<V> &addVector) {
    this->x += addVector.x;
    this->y += addVector.y;
    this->z += addVector.z;
    return *this;
}

template <typename V, typename = typename std::enable_if<std::is_arithmetic<V>::value, V>::type>
void Vector3<V>::Cross(const Vector3<V> &multiplicationVector) {
    V valueX = this->y * multiplicationVector.z - this->z * multiplicationVector.y;
    V valueY = this->z * multiplicationVector.x - this->x * multiplicationVector.z;
    V valueZ = this->x * multiplicationVector.y - this->y * multiplicationVector.x;
    this->x = valueX;
    this->y = valueY;
    this->z = valueZ;
}
  • Вопрос задан
  • 469 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Шаблонные типы нужно определять полностью в хэдере.
Ответ написан
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
name specifier 'Vector3<V>::' for declaration does not refer into a class

Компилятор прав. У тебя нет такого типа. Есть тип Vector3<V,T>, с двумя параметрами в шаблоне.
Можно написать так:
template <class V, typename T>
Vector3<V> &Vector3<V, T>::operator+=(const Vector3<V> &addVector) {
    this->x += addVector.x;
    this->y += addVector.y;
    this->z += addVector.z;
    return *this;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы