问题
Trying to build the source code below from an example given in a textbook. I'm using visual studio 2008.
The compiler doesn't seem to know what to do with sieve:
1>------ Rebuild All started: Project: fig21.40, Configuration: Debug Win32 ------
1>Deleting intermediate and output files for project 'fig21.40', configuration 'Debug|Win32'
1>Compiling...
1>fig21_40.cpp
1>c:\users\ocuk\documents\c++\chapter 21\fig21.40\fig21.40\fig21_40.cpp(27) : error C2668: 'sqrt' : ambiguous call to overloaded function
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(581): could be 'long double sqrt(long double)'
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(533): or 'float sqrt(float)'
1> c:\program files (x86)\microsoft visual studio 9.0\vc\include\math.h(128): or 'double sqrt(double)'
1> while trying to match the argument list '(const int)'
1>Build log was saved at "file://c:\Users\ocuk\Documents\C++\Chapter 21\fig21.40\fig21.40\Debug\BuildLog.htm"
1>fig21.40 - 1 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
code:
//Fig. 21.40: fig21_40.cpp
//Using a bitset to demonstrate the Sieve of Eratosthenses
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <iomanip>
using std::setw;
#include <bitset> //bitset class definition
#include <cmath> //sqrt prototype
int main()
{
const int size=1024;
int value;
std::bitset<size> sieve;
sieve.flip();
//perform Sieve of Eratosthenses
int finalBit = sqrt( sieve.size() ) + 1;
for(int i=2; i<finalBit; ++i)
if(sieve.test(i))
for(int j=2*i; j<size; j+=i)
sieve.reset(j);
cout << "The prime numbers in the range 2 to 1023 are:\n";
//display prime numbers in range 2-1023
for(int k=2, counter=0; k<size; ++k)
if(sieve.test(k)){
cout <<setw(5)<<k;
if(++counter % 12 ==0)
cout << '\n';
}//end outer if
cout << endl;
//get value from user to determine whether value is prime
cout << "\nEnter a value from 1 to 1023(-1 to end): ";
cin>>value;
while(value != -1){
if(sieve[value])
cout << value << " is a prime number\n";
else
cout << value << " is not a prime number\n";
cout << "\nEnter a value from 2 to 1023 (-1 to end): ";
cin >> value;
}//end while
return 0;
}
回答1:
I think that is because in newer versions of C++
, sqrt
is overloaded (argument can be double
, float
or long double
) and you pass in an int. Just cast the argument to double
to make it clear:
int finalBit = sqrt( (double) (sieve.size()) ) + 1;
回答2:
The sqrt
function has these overloads:
float sqrt(float arg);
double sqrt(double arg);
long double sqrt(long double arg);
Since sieve.size()
returns size_t
, the compiler cannot choose which conversion to take - 'float', double
or long double
.
Add a cast to fix this problem. Given the range of the size that you have, it does not really matter what type you are going to pick.
int finalBit = sqrt( (double)sieve.size() ) + 1;
// ^^^^^^^^
// float or long double would work as well.
来源:https://stackoverflow.com/questions/22962661/getting-error-c2668-sqrt-ambiguous-call-to-overloaded-function