Ошибка при использовании boost :: function 1.44 в Visual Studio 2010 - PullRequest
1 голос
/ 10 января 2011

Я попробовал простой пример с boost :: function. Однако я получил сообщение об ошибке компилятора:

#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

Есть идеи?

Спасибо
Chan

Ответы [ 2 ]

5 голосов
/ 10 января 2011

То, что следует за ошибкой, на самом деле довольно интересно:

1> e: [...] \ main.cpp (11): ошибка C2568: '=': невозможно разрешить Перегрузка функции
1> e: [...] \ main.cpp (5): может быть 'float div (float, float)'
1> d: \ microsoft visual studio 10.0 \vc \ include \ stdlib.h (479): или 'lldiv_t div (_ int64, _int64)'
1> d: \ microsoft visual studio 10.0 \ vc \ include \ stdlib.h (475): или 'ldiv_t div (long, long)'
1> d: \ microsoft visual studio 10.0 \ vc \ include \ stdlib.h (432): или 'div_t div (int, int)'

В области видимости есть несколько функций с именем div (начиная с stdlib.h), и компилятор не знает, на какую вы ссылаетесь, когда пишете &div, либо:

  • используйте приведение: f = static_cast<float (*)(float, float)>(&div);
  • поместите вашу div функцию в отдельное пространство имен: f = &my_namespace::div
3 голосов
/ 10 января 2011

div - это название функции стандартной библиотеки C в <stdlib.h>.Visual C ++ включил этот заголовок (вероятно, в <iostream>), поэтому существует двусмысленность.

Вы можете исправить это, используя приведение:

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

Обратите внимание, что не должен помещать эти функции в глобальное пространство имен;вместо этого он должен включать <cstdlib>, где они должны находиться только в пространстве имен std (даже в этом заголовке они также объявляются в глобальном пространстве имен, что неверно, но является распространенным явлением и является текущим состоянием дел, с которым нам приходится житьс).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...