Функция, которая возвращает 'auto', не может быть использована до ее определения - PullRequest
0 голосов
/ 03 мая 2018

У меня есть проект DLL, созданный в Visual C ++, и проект CLR. В моем проекте DLL я экспортировал функцию с типом 'auto'.

staff.h

extern "C" STAFFS_API auto GetStaffMap();

и если staff.cpp имеет возвращаемый тип std :: map.

std::map<int, std::string> staffMap;
auto GetStaffMap() 
{
  return staffMap;
}

Теперь в моем приложении CLR, Я называю эту функцию:

#include <map>
#include "Staff.h"
std::map<int, std::string> staffMap = Staffs::GetStaffMap();

И когда я компилирую программу, появляется сообщение об ошибке:

C3779 'Staffs::GetStaffMap': a function that returns 'auto' cannot be used before it is defined.

UPDATE

Я пытался, staff.h

extern "C" STAFFS_API auto GetStaffMap() -> std::map<int, std::string>;

staff.cpp

extern "C" auto GetStaffMap() -> std::map<int, std::string> {
  return staffMap;
}

, но ошибка компиляции сохраняется:

Error   C2526   'GetStaffMap': C linkage function cannot return C++ class 'std::map<int,std::string,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>>'  AmsCppRest  c:\users\laptop-attendance\source\repos\amscpprest\amscpprest\staff.h

Error   C2556   'std::map<int,std::string,std::less<int>,std::allocator<std::pair<const _Kty,_Ty>>> Staffs::GetStaffMap(void)': overloaded function differs only by return type from 'void Staffs::GetStaffMap(void)'   AmsCppRest  c:\users\laptop-attendance\source\repos\amscpprest\amscpprest\staff.cpp

Error  C2371 'Staffs::GetStaffMap': redefinition; different basic types

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Вы должны объявить возвращаемый тип, чтобы компилятор знал это.

// Declaration
extern "C" STAFFS_API auto GetStaffMap() -> std::map<int, std::string>;

// Definition
extern "C" auto GetStaffMap() -> std::map<int, std::string>
{
  return staffMap;
}
0 голосов
/ 03 мая 2018

auto не задерживает поиск типа возврата функции. Это просто заставляет компилятор взглянуть на реализацию, чтобы выяснить, что это такое auto математически. Вам придется вручную объявить тип возвращаемого значения в заголовке, поскольку код, который включает в себя заголовок, должен знать, что такое возвращаемый тип.

...