2011-01-10 65 views
1

我嘗試了boost :: function的一個簡單示例。但是我得到了編譯器錯誤說:錯誤在Visual Studio 2010中使用boost :: function 1.44

#include <boost/array.hpp> 
#include <boost/function.hpp> 
#include <iostream> 

float div(float x, float y) { 
return x/y; 
} 

int main() { 
boost::function<float (float x, float y)> f; 
f = &div; 
std::cout << f(3.0f, 3.5f) << "\n"; 
} 

錯誤:

Error 2 error C2568: '=' : unable to resolve function overload c:\visual studio 2010 projects\net report\net report\main.cpp 12 1 NET Report 
Error 1 error C2563: mismatch in formal parameter list c:\visual studio 2010 projects\net report\net report\main.cpp 12 1 NET Report 

任何想法?

感謝,

+1

`div`似乎是一個保留的標識符。也許有人可以在答案中詳細闡述。只需將其改爲像mydiv這樣的解決方案即可。 – AraK 2011-01-10 19:26:12

+0

@AraK div不保留在C++或VS中。 – ybungalobill 2011-01-10 19:30:09

回答

5

接下來的錯誤其實是很有趣的:

1> e:[...]\main.cpp(11): error C2568: '=' : unable to resolve function overload
1> e:[...]\main.cpp(5): could be 'float div(float,float)'
1> d:\microsoft visual studio 10.0\vc\include\stdlib.h(479): or 'lldiv_t div(_int64,_int64)'
1> d:\microsoft visual studio 10.0\vc\include\stdlib.h(475): or 'ldiv_t div(long,long)'
1> d:\microsoft visual studio 10.0\vc\include\stdlib.h(432): or 'div_t div(int,int)'

有一個名爲範圍div(從stdlib.h到來)多種功能,並且編譯器不知道哪個您在編寫&div時指的一個:

  • 使用強制:f = static_cast<float (*)(float, float)>(&div);
  • 把你div功能在不同的命名空間:f = &my_namespace::div
3

div<stdlib.h>一個C標準庫函數的名稱。 Visual C++已經包含了這個頭文件(可能在<iostream>),因此存在一個不明確的地方。

您可以使用強制修復:

f = (float(*)(float, float))&div;  

注意,它不應把這些功能整合到全局命名空間;它應該包括<cstdlib>而不是它們應該只在名稱空間std中(即使在該頭文件中它們也在全局命名空間中聲明,這是錯誤的,但是很常見,並且是我們必須忍受的事情的當前狀態)。