2012-03-04 29 views
5

Với C++, tôi cố gắng"nhiều hơn một thể hiện của chức năng quá tải 'std :: pow' phù hợp với danh sách đối số"

#define TINY std::pow(10,-10) 

tôi cung cấp cho các mã với các #include và namespace thông tin cho lớp (. h), nơi TINY được định nghĩa

#pragma once 
#include "MMath.h" 
#include <string> 
#include <cmath> 
#include <vector> 

using namespace std; 

#define TINY std::pow(10,-10) 

tôi sử dụng TINY trong một số thực hiện chức năng trong tập tin cpp, và TINY cho lỗi

IntelliSense: nhiều hơn một thể hiện của hàm quá tải "std :: pow" khớp với danh sách đối số

Cú pháp đúng là gì?

+4

tiêu đề câu hỏi này là rất sai lầm vì nó đã hoàn toàn không có gì để làm với các tiền xử lý. Tại sao bạn sử dụng pow, thay vì chỉ viết 1e-10? – PlasmaHH

+0

thử std :: pow (10.0, 10.0) để chọn rõ ràng quá tải phao/đôi. –

+6

+1 cho PlasmaHH: Sử dụng 'const double tiny = 1E-10;' là giải pháp tốt nhất và tốt nhất-C++. –

Trả lời

10

Chỉnh sửa: Tôi đồng ý với những người bình luận nói rằng sử dụng std :: pow() thay cho hằng số chữ là không cần thiết - vì vậy đối với vấn đề cụ thể này, đi với hằng số 1.0E-10; lời giải thích của tôi về lỗi thực tế mà bạn đang nhận được và cách giải quyết nó vẫn đứng vững.

Điều này không liên quan gì đến số #define của bạn. std::pow() là một hàm bị quá tải và không có quá tải nào của nó mất (int, int) làm đối số. Bạn nên cung cấp các đối số với các kiểu lựa chọn quá tải một cách rõ ràng. Tùy thuộc vào loại giá trị trả về mà bạn muốn, có thể bạn sẽ muốn chọn một trong các quá tải:

 float pow (  float base,  float exponent); 
    double pow (  double base,   int exponent); 
long double pow (long double base,   int exponent); 

mà bạn có thể gọi như sau:

std::pow(10.0f, -10.0f) 
std::pow(10.0, -10) 
std::pow(10.0L, -10) 

tương ứng.

1

Hãy thử sử dụng std::pow(10.0,-10.0) thay vào đó: std::pow có nhiều số overloads khớp với danh sách đối số của bạn; quy định cụ thể 10.0,-10.0 buộc sử dụng quá tải cụ thể:

double pow(double base, double exponent); 

Lưu ý rằng #define này có thể tối ưu tùy thuộc vào việc sử dụng các TINY: mỗi khi bạn sử dụng nó trong mã của bạn, một cuộc gọi sẽ được thực hiện để std::pow để tính toán cùng giá trị. Một cách tiếp cận tốt hơn sẽ là sử dụng một biến tĩnh, thiết lập nó một lần và sử dụng nó từ thời điểm đó.

2

Tôi nghĩ rằng cách tốt nhất là để xác định một biến liên tục và khởi tạo nó mà không sử dụng pow chức năng, như

const double TINY = 1E-10; //1e-10 is 10 to the power of -10 
Các vấn đề liên quan