相关疑难解决方法(0)

C++ CLI错误C3767:无法访问候选函数

我是来自非托管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++-cli

13
推荐指数
1
解决办法
2万
查看次数

建议放置 make_public pragmas 的位置

在一个复杂的解决方案中,我混合了本机 C++ 库、C++/CLI 包装器和 C# 程序集。在包装器中,我经常必须使用本机类型,因此我必须使用#pragma make_public. 然而,这些编译指示的问题是,您经常会遇到链接器错误 LNK2022,如此此处(以及许多其他地方)所讨论的。

通常的解决方案是将所有编译指示收集在一处,以避免重复类型错误。到目前为止,我发现的唯一可靠的地方是将列表放入我的stdafx.h头文件中。然而,这很烦人,因为一旦我必须在那里添加新的本机类型(这是我的预编译头),它就会导致我的整个项目重新编译。

我想将该列表提取到单独的标头中,或者更好的是 cpp 文件中。但到目前为止我的尝试还没有奏效。未公开的类型。看来我还必须将#pragma make_public调用放入头文件中。不过我更喜欢cpp。

那么,还存在哪些其他可能性呢?其他人在哪里拨打#pragma make_public电话?

c# c++ c++-cli pragma visual-studio

2
推荐指数
1
解决办法
1797
查看次数

标签 统计

c++-cli ×2

c# ×1

c++ ×1

pragma ×1

visual-studio ×1