Nightmare1
@Nightmare1
Программист

По какой причине метод не определён?

Код ошибки.

./Machinarium/Classes/Geometry/Vector2.cpp: In member function ‘virtual float Vector2D<T>::length()’:
./Machinarium/Classes/Geometry/Vector2.cpp:35:17: error: ‘x’ was not declared in this scope
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                 ^
./Machinarium/Classes/Geometry/Vector2.cpp:35:20: error: expected primary-expression before ‘>’ token
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                    ^
./Machinarium/Classes/Geometry/Vector2.cpp:35:22: error: expected primary-expression before ‘)’ token
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                      ^
./Machinarium/Classes/Geometry/Vector2.cpp:35:28: error: ‘y’ was not declared in this scope
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                            ^
./Machinarium/Classes/Geometry/Vector2.cpp:35:31: error: expected primary-expression before ‘>’ token
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                               ^
./Machinarium/Classes/Geometry/Vector2.cpp:35:33: error: expected primary-expression before ‘)’ token
   35 |     return sqrt(x<T>()^2 + y<T>()^2);
      |                                 ^
./Machinarium/Classes/Geometry/Vector2.cpp: In member function ‘virtual Vector2D<T> Vector2D<T>::add_by_vector(const Vector2D<T>&)’:
./Machinarium/Classes/Geometry/Vector2.cpp:41:26: error: ‘x’ was not declared in this scope
   41 |     return DVector(2)<T>(x<T>() + vector2d.x<T>(), y<T>() + vector2d.y<T>());
      |                          ^
./Machinarium/Classes/Geometry/Vector2.cpp:41:52: error: ‘y’ was not declared in this scope
   41 |     return DVector(2)<T>(x<T>() + vector2d.x<T>(), y<T>() + vector2d.y<T>());
      |                                                    ^
./Machinarium/Classes/Geometry/Vector2.cpp:41:25: error: expected primary-expression before ‘(’ token
   41 |     return DVector(2)<T>(x<T>() + vector2d.x<T>(), y<T>() + vector2d.y<T>());
      |                         ^


#define ParameterGetSetTyped(var_type, name)        \
private:                                            \
    var_type __ ## name;                            \
public:                                             \
    var_type name (var_type value = 0) {            \
        if (value == 0)                             \
            return __ ## name;                      \
        else                                        \
            set_ ## name(value);                    \
        return value;}                              \
    var_type get_ ## name () {return __ ## name;}   \
    var_type set_ ## name (var_type value) {__ ## name = value;} 


...

template<typename T>
class DVector(2P) : public BaseGUISegmentClass
{
/**
    * @brief Класс вектора с двумя членами.
    * 
    */

    ParameterGetSetTyped(T, x);
    ParameterGetSetTyped(T, y);

...
template<typename T>
class DVector(2) : public DVector(2P)<T>, public IVector<DVector(2P)<T>, T>
{
public:

...

.cpp

template<typename T>
float DVector(2)<T>::length()
{
    return sqrt(x<T>()^2 + y<T>()^2);
}


По какой причине не видятся методы .x .y
но метод наследования публичный?
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
По какой причине не видятся методы .x .y
sqrt(x<T>()^2 + y<T>()^2);

А почему ты думаешь, что это шаблонные методы? Вот здесь
var_type name (var_type value = 0) { \
определение совсем не шаблонное. Т.е. надо выкинуть <T>. А когда ты так сделаешь, x и y станут независимыми именами, и чтобы компилятор их нашёл в родительском классе надо будет либо добавить перед ними this->, либо как-нибудь ещё ему подсказать.
Т.е. вот так должно бы работать:
template<typename T>
float DVector(2)<T>::length()
{
    return sqrt(this->x()^2 + this->y()^2);
}


И, кстати, ^2 -- это (без дополнительных усилий) не возведение в квадрат.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы