-1

I am very sorry to pasted a very lengthy code here, but I found that's the best way to present this question. I think my compiler is ignoring the #include "Vector2.hpp". so please help me to solve this error. Your response would be very apricated!! thank you

getting error in this part of code (function name : liftpiece) :

if(e.key.code==Mouse::Left)
            {
                ismove=false;
                Vector2f p = s2[n].getPosition() + Vector2f(53.25,53.25);
                Vector2f newPos = Vector2f( 106.5*int(p.x/106.5), 106.5*int(p.y/106.5) );
                s2[n].setPosition(newPos);
            }

Full code :

#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>

#include <time.h>
#include "texture.h"
#include "Mouse.h"
#include "Sprite.h"
#include "Vector2.hpp"
#include "Transformable.h"

using namespace sf;


int boardarr[8][8]= {-5,-4,-3,-2,-1,-3,-4,-5,
                     -6,-6,-6,-6,-6,-6,-6,-6,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0,
                      6, 6, 6, 6, 6, 6, 6, 6,
                      5, 4, 3, 2, 1, 3, 4, 5};


class GAME

{

private:

    Texture board,piece;
    Sprite s1;
    Sprite s2[32];
    bool ismove=false;
    int dx=0,dy=0,n=0;



public :

    void droppiece(Vector2i POS)
    {
        if(this->ismove)
        {
            s2[n].setPosition(POS.x-dx,POS.y-dy);

        }
    }

    void liftpiece(Event e, Vector2i POS)
    {
        if(e.type==Event::MouseButtonPressed)
        {
            if(e.key.code==Mouse::Left)
            {
                for(int i=0; i<32; i++)
                {
                    if(s2[i].getGlobalBounds().contains(POS.x,POS.y))
                    {
                        ismove = true;
                        n=i;
                        dx = POS.x - s2[i].getPosition().x;
                        dy = POS.y - s2[i].getPosition().y;
                    }

                }
            }
        }

        if(e.type==Event::MouseButtonReleased)
        {
            if(e.key.code==Mouse::Left)
            {
                ismove=false;
                Vector2f p = s2[n].getPosition() + Vector2f(53.25,53.25);
                Vector2f newPos = Vector2f( 106.5*int(p.x/106.5), 106.5*int(p.y/106.5) );
                s2[n].setPosition(newPos);
            }
        }

    }


    void setimages()
    {

        board.loadFromFile("C:\\Users\\JIMMY RATHWA\\OneDrive\\Desktop\\images\\chessboard.png");
        piece.loadFromFile("C:\\Users\\JIMMY RATHWA\\OneDrive\\Desktop\\images\\chesspiece.png");

        s1.setTexture(board);
        piece.setSmooth(true);

        for(int i=0; i<32; i++)
        {
            s2[i].setTexture(piece);
        }

    }

    void setpieces()
    {
        int k=0;

        for(int i=0; i<8; i++)
        {
            for(int j=0; j<8; j++)
            {
                int n = boardarr[i][j];
                if(!n)
                {
                    continue;
                }
                int x = abs(n)-1;
                int y = n>0?0:1;
                s2[k].setTextureRect(IntRect(106.5*x,106.5*y,106.5,106.5));
                s2[k].setPosition(106.5*j,106.5*i);
                k++;
            }

        }


    }

    void windowdisplay()
    {

        RenderWindow Window(VideoMode(850,850),"JIMMY CHESS",Style::Titlebar|Style::Close);
        setimages();
        setpieces();

        while(Window.isOpen())
        {
            Event e;

            Vector2i POS = Mouse::getPosition(Window);

            while(Window.pollEvent(e))
            {

                if(e.type==Event::Closed)
                {
                    Window.close();
                }

                liftpiece(e,POS);

            }

            droppiece(POS);

            Window.clear();

            Window.draw(s1);

            for(int i=0; i<32; i++)
            {
                Window.draw(s2[i]);
            }
            //layer 1 : chess board
            Window.display();


        }

    }



};


int main()
{
    GAME game;

    game.windowdisplay();

    return 0;
}

error : undefined reference to `sf::Vector2::Vector2(float, float)'

Vector2.hpp :

////////////////////////////////////////////////////////////
//
// SFML - Simple and Fast Multimedia Library
// Copyright (C) 2007-2018 Laurent Gomila (laurent@sfml-dev.org)
//
// This software is provided 'as-is', without any express or implied warranty.
// In no event will the authors be held liable for any damages arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it freely,
// subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented;
//    you must not claim that you wrote the original software.
//    If you use this software in a product, an acknowledgment
//    in the product documentation would be appreciated but is not required.
//
// 2. Altered source versions must be plainly marked as such,
//    and must not be misrepresented as being the original software.
//
// 3. This notice may not be removed or altered from any source distribution.
//
////////////////////////////////////////////////////////////

#ifndef SFML_VECTOR2_HPP
#define SFML_VECTOR2_HPP


namespace sf
{
////////////////////////////////////////////////////////////
/// \brief Utility template class for manipulating
///        2-dimensional vectors
///
////////////////////////////////////////////////////////////
template <typename T>
class Vector2
{
public:

    ////////////////////////////////////////////////////////////
    /// \brief Default constructor
    ///
    /// Creates a Vector2(0, 0).
    ///
    ////////////////////////////////////////////////////////////
    Vector2();

    ////////////////////////////////////////////////////////////
    /// \brief Construct the vector from its coordinates
    ///
    /// \param X X coordinate
    /// \param Y Y coordinate
    ///
    ////////////////////////////////////////////////////////////
    Vector2(T X, T Y);

    ////////////////////////////////////////////////////////////
    /// \brief Construct the vector from another type of vector
    ///
    /// This constructor doesn't replace the copy constructor,
    /// it's called only when U != T.
    /// A call to this constructor will fail to compile if U
    /// is not convertible to T.
    ///
    /// \param vector Vector to convert
    ///
    ////////////////////////////////////////////////////////////
    template <typename U>
    explicit Vector2(const Vector2<U>& vector);

    ////////////////////////////////////////////////////////////
    // Member data
    ////////////////////////////////////////////////////////////
    T x; ///< X coordinate of the vector
    T y; ///< Y coordinate of the vector
};

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of unary operator -
///
/// \param right Vector to negate
///
/// \return Memberwise opposite of the vector
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator -(const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator +=
///
/// This operator performs a memberwise addition of both vectors,
/// and assigns the result to \a left.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return Reference to \a left
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T>& operator +=(Vector2<T>& left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator -=
///
/// This operator performs a memberwise subtraction of both vectors,
/// and assigns the result to \a left.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return Reference to \a left
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T>& operator -=(Vector2<T>& left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator +
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return Memberwise addition of both vectors
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator +(const Vector2<T>& left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator -
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return Memberwise subtraction of both vectors
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator -(const Vector2<T>& left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator *
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a scalar value)
///
/// \return Memberwise multiplication by \a right
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator *(const Vector2<T>& left, T right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator *
///
/// \param left  Left operand (a scalar value)
/// \param right Right operand (a vector)
///
/// \return Memberwise multiplication by \a left
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator *(T left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator *=
///
/// This operator performs a memberwise multiplication by \a right,
/// and assigns the result to \a left.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a scalar value)
///
/// \return Reference to \a left
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T>& operator *=(Vector2<T>& left, T right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator /
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a scalar value)
///
/// \return Memberwise division by \a right
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T> operator /(const Vector2<T>& left, T right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator /=
///
/// This operator performs a memberwise division by \a right,
/// and assigns the result to \a left.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a scalar value)
///
/// \return Reference to \a left
///
////////////////////////////////////////////////////////////
template <typename T>
Vector2<T>& operator /=(Vector2<T>& left, T right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator ==
///
/// This operator compares strict equality between two vectors.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return True if \a left is equal to \a right
///
////////////////////////////////////////////////////////////
template <typename T>
bool operator ==(const Vector2<T>& left, const Vector2<T>& right);

////////////////////////////////////////////////////////////
/// \relates Vector2
/// \brief Overload of binary operator !=
///
/// This operator compares strict difference between two vectors.
///
/// \param left  Left operand (a vector)
/// \param right Right operand (a vector)
///
/// \return True if \a left is not equal to \a right
///
////////////////////////////////////////////////////////////
template <typename T>
bool operator !=(const Vector2<T>& left, const Vector2<T>& right);

#include <SFML/System/Vector2.inl>

// Define the most common types
typedef Vector2<int>          Vector2i;
typedef Vector2<unsigned int> Vector2u;
typedef Vector2<float>        Vector2f;

} // namespace sf


#endif // SFML_VECTOR2_HPP


////////////////////////////////////////////////////////////
/// \class sf::Vector2
/// \ingroup system
///
/// sf::Vector2 is a simple class that defines a mathematical
/// vector with two coordinates (x and y). It can be used to
/// represent anything that has two dimensions: a size, a point,
/// a velocity, etc.
///
/// The template parameter T is the type of the coordinates. It
/// can be any type that supports arithmetic operations (+, -, /, *)
/// and comparisons (==, !=), for example int or float.
///
/// You generally don't have to care about the templated form (sf::Vector2<T>),
/// the most common specializations have special typedefs:
/// \li sf::Vector2<float> is sf::Vector2f
/// \li sf::Vector2<int> is sf::Vector2i
/// \li sf::Vector2<unsigned int> is sf::Vector2u
///
/// The sf::Vector2 class has a small and simple interface, its x and y members
/// can be accessed directly (there are no accessors like setX(), getX()) and it
/// contains no mathematical function like dot product, cross product, length, etc.
///
/// Usage example:
/// \code
/// sf::Vector2f v1(16.5f, 24.f);
/// v1.x = 18.2f;
/// float y = v1.y;
///
/// sf::Vector2f v2 = v1 * 5.f;
/// sf::Vector2f v3;
/// v3 = v1 + v2;
///
/// bool different = (v2 != v3);
/// \endcode
///
/// Note: for 3-dimensional vectors, see sf::Vector3.
///
////////////////////////////////////////////////////////////
JimmY
  • 3
  • 2
  • Do you have the valid `SFML/System/Vector2.inl`? – 273K Feb 07 '22 at 15:25
  • 1
    Does this answer your question? [What is an undefined reference/unresolved external symbol error and how do I fix it?](https://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-do-i-fix) – Stephen Newell Feb 07 '22 at 15:31
  • Seeing this and your other question, it looks like you don't know how to use external libraries in your code. My friendly recommendation is for you to learn how libraries work in C++. Write one of your own, following any online tutorial, and afterwards read the SFML page about how to install and use their libraries. Otherwise it's just impossible to help you. Good luck! – Miguel Feb 15 '22 at 09:08

1 Answers1

0

error : undefined reference to 'sf::Vector2::Vector2(float, float)' is a link error: It's saying it knows that you've declared that function, but when it went to find the implementation, it can't find it. You need to either have an implementation of template <typename T> sf::Vector2::Vector2(T,T) in the header, or provide it in a .cpp and link against it. For templated code like this it's typically in the .h.

Ben
  • 9,184
  • 1
  • 43
  • 56
  • sorry but can you tell me how to exactly do these two things? i am pretty weak at this. – JimmY Feb 08 '22 at 03:44