./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
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
-- это (без дополнительных усилий) не возведение в квадрат.