2014-10-26 49 views
1

我試圖編譯克++編程,其在Visual Studio 2012'ptr_fun(isalnum)'不會在g ++中編譯?

我收到錯誤編譯罰款:error: no matching function for call to ‘ptr_fun(<unresolved overloaded function type>)’

據我所知,我已經包括了所有的庫和頭文件我需要。我錯過了什麼?

這裏是我的代碼:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iostream> 
#include <string> 
#include <functional> 
#include <ctype.h> 
#include <stdio.h> 

using namespace std; 

int main() { 

    string secretWord; //to store our secret word 
    string secretWordClean = ""; //given an initial value so that we can add the alpha-only characters from secretWord 
    string guessedLetters; //to be loaded with _ characters equal to length of secretWord 
    string incorrectlyGuessedChars = ""; //for storing our incorrectly guessed characters to be show to the user 
    char individualCharGuess; //to temporarily store the individual char guess of the user 
    char playAgain; //will be set to Y to play again, and tested in an if statment 
    size_t countOfLetters = 0; //begine count at 0 
    size_t guessesRemaining; //to store the remaining guesses of the user, will be decrimented each iteration 
    int guessedUsed; //to calulate how many guesses the player used when game is complete 

begin_game://label which we can use to bring us back to the start of the do-while loop at any time 

    cout << "Please enter a secret word: "; 

    std::cin >> std::ws; 
    getline(std::cin, secretWord); 
    secretWord.erase(std::remove_if(secretWord.begin(), secretWord.end(), std::not1(std::ptr_fun(isalnum))), secretWord.end()); 

    for(int i = 0; i < secretWord.length(); i++){ 
     if (isalpha(secretWord[i])){ 
      secretWordClean += secretWord[i]; 
     } 
    } 

    secretWord = secretWordClean; //assign all alpha secret word string back to original variable for better readability 
    guessesRemaining = secretWord.length() * 2; 

    for(int i = 0; i < secretWord.length(); i++){ 
     guessedLetters += "_"; //fills guessedLetters with blanks equal to the length of the secretWord 
    } 

    do{//start of the guessing portion of game 

     cout << "Please guess a letter, you have " << guessesRemaining << " guesses remaining!" << endl; 
     cin >> individualCharGuess; 

     for(int i = 0; i < secretWord.length(); i++){ //every complete iteration of this for loop = one single guess 
      if(secretWord[i] == individualCharGuess){ 
       guessedLetters[i] = individualCharGuess; //will replace the spaces with the correct character, if guessed 
       countOfLetters++; //if any letter is guessed correctly, this indicator will be incrimented above 0 
       continue; 
      } 

      if(secretWord.find(individualCharGuess) == string::npos){ 
       if(incorrectlyGuessedChars.find(individualCharGuess) == string::npos){ 
        incorrectlyGuessedChars += individualCharGuess; 
       } 
      } 
     } 

     if(secretWord.compare(guessedLetters) == 0){ 
      cout << "You win! The word was: " << secretWord << endl; 
      guessedUsed = ((secretWord.length() * 2) - guessesRemaining) + 1 ; 
      cout << "You used " << guessedUsed << " guesses." << endl; 
      cout << "Play again? Enter Y for Yes, or anything else to exit: "; 
      cin >> playAgain; 
      if(playAgain != 'Y'){ 
       break; //exit the loop if user guesses all the letters and doesn't want to play again 
      } 
      else { 
       incorrectlyGuessedChars = ""; 
       secretWordClean = ""; 
       guessedLetters = ""; 
       //continue; 
       goto begin_game; 
      } 
     } 

     guessesRemaining--; //we decriment our total guesses remaining if the user does not win the game or run out of guesses 

     if(countOfLetters > 0){ 
      cout << "You have correctly guessed a letter!" << endl; 
      cout << "Here are the letters you have guessed correctly so far: "; 
      cout << guessedLetters << endl; 
      cout << "Here are the letters you have guessed incorrectly so far: "; 
      cout << incorrectlyGuessedChars << endl; 
      countOfLetters = 0; //reset the counter to prepare for next iteration of do-while loop 
     } 
     else if (guessesRemaining <= 0) { 
      cout << "You have run out of guesses!" << endl; 
      cout << "Here are the letters that you guessed correctly: "; 
      cout << guessedLetters << endl; 
      cout << "Here are the letters you guessed incorrectly: "; 
      cout << incorrectlyGuessedChars << endl; 
      cout << "The secret word was: " << secretWord << endl; 
      cout << "Play again? Enter Y for Yes, or anything else to exit: "; 
      cin >> playAgain; 
      if(playAgain != 'Y'){ 
       break; //exit the loop if user guesses all the letters and doesn't want to play again 
      } 
      else { 
       secretWordClean = ""; 
       incorrectlyGuessedChars = ""; 
       guessedLetters = ""; 
       //continue; 
       goto begin_game; 
      } 
     } 
     else { 
      cout << "You guessed wrong! Keep trying, " << guessesRemaining << " guesses to go!" << endl; 
      cout << "Here are the letters you have guessed correctly so far: "; 
      cout << guessedLetters << endl; 
      cout << "Here are the letters you have guessed incorrectly so far: "; 
      cout << incorrectlyGuessedChars << endl; 
     } 

    }while (secretWord.compare(guessedLetters) != 0 || guessesRemaining != 0); //use to repeat the request for a single char guess 

    return 0; 
} 
+0

'#include ' - >'#include '也許 – 2014-10-26 14:55:59

+0

謝謝,我試過了,但沒有運氣。 – FluffyKittens 2014-10-26 15:01:15

回答

4

你應該給它一點幫助推斷模板類型:

std::not1(std::ptr_fun<int, int>(isalnum))) 

或完全限定它:

std::not1(std::ptr_fun(::isalnum))) 

它由於語言環境的功能,似乎gcc和clang有多個重載決議候選項。

+0

或'std :: not1(ptr_fun(:: isalnum))' – P0W 2014-10-26 15:03:05

+0

@ P0W是的,我會補充一點。謝謝 – 2014-10-26 15:03:47

+1

有一次,馬可再次贏得勝利。謝謝。我現在要打個盹,喝一杯啤酒。我的天哪,你是個天才。 – FluffyKittens 2014-10-26 15:09:39