【问题标题】:Getting: error C2668: 'sqrt' : ambiguous call to overloaded function [duplicate]获取:错误 C2668:'sqrt':对重载函数的模糊调用 [重复]
【发布时间】:2014-05-22 15:52:59
【问题描述】:

尝试从教科书中给出的示例构建下面的源代码。 我正在使用 Visual Studio 2008。

编译器似乎不知道如何处理 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 ==========

代码:

//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;
}

【问题讨论】:

    标签: c++ visual-c++ visual-studio-2008


    【解决方案1】:

    我认为这是因为在较新版本的 C++ 中,sqrt 被重载(参数可以是 doublefloatlong double)并且你传入了一个 int。只需将参数转换为double 即可:

    int finalBit = sqrt( (double) (sieve.size()) ) + 1;
    

    【讨论】:

      【解决方案2】:

      sqrt 函数具有以下重载:

      float       sqrt(float arg);
      double      sqrt(double arg);
      long double sqrt(long double arg);
      

      由于sieve.size() 返回size_t,编译器无法选择进行哪个转换 - 'float'、doublelong double

      添加一个演员来解决这个问题。鉴于您拥有的尺寸范围,您要选择哪种类型并不重要。

      int finalBit = sqrt( (double)sieve.size() ) + 1;
      //                   ^^^^^^^^
      // float or long double would work as well.
      

      【讨论】:

      • 感谢你们俩,我会接受 Axel 的,因为他是第一个,但你们都非常乐于助人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多