首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >获得对向量2.h类的未定义引用的错误

获得对向量2.h类的未定义引用的错误
EN

Stack Overflow用户
提问于 2022-02-07 15:20:09
回答 1查看 322关注 0票数 -1

我很抱歉在这里粘贴了一个非常长的代码,但我发现这是提出这个问题的最佳方法。我认为我的编译器忽略了#include "Vector2.hpp“。所以请帮我解决这个错误。你的回答会很贴切!!谢谢

在代码的这一部分中获得错误(函数名: part ) :

代码语言:javascript
运行
复制
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);
            }

完整代码

代码语言:javascript
运行
复制
#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:对‘`sf::Vector2 2::Vector2 2(浮点,浮点数)’的未定义引用

Vector2.hpp

代码语言:javascript
运行
复制
////////////////////////////////////////////////////////////
//
// 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.
///
////////////////////////////////////////////////////////////
EN

回答 1

Stack Overflow用户

发布于 2022-02-07 15:26:52

error : undefined reference to 'sf::Vector2::Vector2(float, float)'是一个链接错误:它说它知道您已经声明了这个函数,但是当它找到实现时,它就找不到了。您需要在标头中有一个template <typename T> sf::Vector2::Vector2(T,T)的实现,或者在一个.cpp中提供它并对它进行链接。对于这种模板化的代码,它通常在.h中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71020980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档