我是来自非托管C++世界的C++ CLI的新手.
我收到这个错误:
candidate function(s) not accessible
Run Code Online (Sandbox Code Playgroud)
当我传递一个std :: string作为方法参数的一部分.
这是确切的代码:
Lib Project(编译为.dll项目)
//Lib.h
#pragma once
public ref class Lib
{
public:
Lib(void);
public:
void Extract( std::string& data_ );
};
Run Code Online (Sandbox Code Playgroud)
//Lib.cpp
#include "Lib.h"
Lib::Lib(void)
{
}
void Lib::Extract( std::string& data_ )
{
data_.empty();
}
Run Code Online (Sandbox Code Playgroud)
LibTest项目(编译为application.exe)
// LibTest.h
#pragma once
ref class LibTest
{
public:
LibTest(void);
};
Run Code Online (Sandbox Code Playgroud)
// LibTest.cpp
#include "LibTest.h"
LibTest::LibTest(void)
{
Lib^ lib = gcnew Lib;
lib->Extract( std::string("test") );
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器错误:
1>------ Build …Run Code Online (Sandbox Code Playgroud) 在一个复杂的解决方案中,我混合了本机 C++ 库、C++/CLI 包装器和 C# 程序集。在包装器中,我经常必须使用本机类型,因此我必须使用#pragma make_public. 然而,这些编译指示的问题是,您经常会遇到链接器错误 LNK2022,如此处和此处(以及许多其他地方)所讨论的。
通常的解决方案是将所有编译指示收集在一处,以避免重复类型错误。到目前为止,我发现的唯一可靠的地方是将列表放入我的stdafx.h头文件中。然而,这很烦人,因为一旦我必须在那里添加新的本机类型(这是我的预编译头),它就会导致我的整个项目重新编译。
我想将该列表提取到单独的标头中,或者更好的是 cpp 文件中。但到目前为止我的尝试还没有奏效。未公开的类型。看来我还必须将#pragma make_public调用放入头文件中。不过我更喜欢cpp。
那么,还存在哪些其他可能性呢?其他人在哪里拨打#pragma make_public电话?