title: How to transfer a NFT from one account to another using ERC721?
body: <p>I'm writing an NFT smart contract using the OpenZeppelin ERC721Full contract. I'm able to mint NFTs, but I want to have a button that enables them to be bought. I'm trying writing this function:</p>
  <pre><code>function buyNFT(uint _id) public payable{
      //Get NFT owner address
      address payable _seller = ownerOf(_id);
  
      // aprove nft sell
      approve(_seller, _id);
      setApprovalForAll(msg.sender, true);
  
      //transfer NFT
      transferFrom(_seller, msg.sender, _id);
  
      // transfer price in ETH
      address(_seller).transfer(msg.value);
  
      emit NftBought(_seller, msg.sender, msg.value);
  
    }
  </code></pre>
  <p>This does not work because function approve must be called by the owner or an already approved address. I have no clue on how a buy function should be built. I know that I must use some requirements but first I want the function to work on tests and then I'll write the requirements.</p>
  <p><strong>How should a buy function be coded?</strong> Because the only solution I have found is to overwrite the approve function and omit the require of who can call this function. But it looks like it isn't the way it should be done.</p>
  <p>Thank you!</p>