更新:如评论中所述,C++/CLI应该是value struct; 编译器错误'明确'陈述"必须是值类型".
在C#中,我可以写
public struct Id<T> : IComparable<Id<T>>
{
public int CompareTo(Id<T> other)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在C++/CLI中执行相同操作时
generic<typename T>
public ref struct Id : System::IComparable<Id<T>>
{
public:
virtual int CompareTo(Id<T> other)
{
throw gcnew System::NotImplementedException();
}
};
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误error C3225: generic type argument for 'T' cannot be '...::Id<T>', it must be a value type or a handle to a reference type.
难道这仍然是不固定的编译器错误?
编辑:制作Foo并Bar稍微不那么琐碎,直接替换shared_ptr<>更难.
应该unique_ptr<>用作实现移动语义的更简单方法吗?
对于像这样的课程
class Foo
{
int* m_pInts;
bool usedNew;
// other members ...
public:
Foo(size_t num, bool useNew=true) : usedNew(useNew) {
if (usedNew)
m_pInts = new int[num];
else
m_pInts = static_cast<int*>(calloc(num, sizeof(int)));
}
~Foo() {
if (usedNew)
delete[] m_pInts;
else
free(m_pInts);
}
// no copy, but move
Foo(const Foo&) = delete;
Foo& operator=(const Foo&) = delete;
Foo(Foo&& other) {
*this = std::move(other);
}
Foo& operator=(Foo&& other) {
m_pInts = other.m_pInts; …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试修改类,以使模型上的文本属性包含某个节点(text)节点的所有内部文本。
给我一些问题的xml示例是:
<component>
<section>
<title>Reason for Visit</title>
<text>
<content ID="ID3EZZKACA">No Reason for Visit was given.</content>
</text>
</section>
</component>
Run Code Online (Sandbox Code Playgroud)
我的目标是使模型的text属性具有以下字符串:
"<content ID="ID0EAAKACA">No Reason for Visit was given.</content>"
目前,我的模型如下所示:
public partial class ComponentSection {
//other model properties here
private string textField;
[System.Xml.Serialization.XmlTextAttribute()]
public string text {
get {
return this.textField;
}
set {
this.textField = value;
}
}
//getters/setters for other properties here
}
Run Code Online (Sandbox Code Playgroud)
因此,我目前正在尝试通过使用注释来完成此操作,[System.Xml.Serialization.XmlTextAttribute()]但是当我这样做时,在对XML进行反序列化时,text属性始终通过null来实现。
基本上我需要从Visual C++代码调用C#代码.在阅读了很多关于可能方法的文章后,我决定使用C++/CLI机制.
最初我决定在C++本机代码(dll库项目)中有一些函数,它们将调用CLR项目中的一些函数,这些函数将调用C#项目中的一些函数.
在那之后,我想也许我可以摆脱桥梁项目(CLR项目),因为它只是向管理世界过渡.我认为我可以创建我的原生项目,我可以添加一个c ++源文件,我可以只为该文件而不是整个项目启用CLR支持.所以这意味着我的本机项目将只包含一个可以使用C++/CLI语法并代表桥接的文件.所有其他文件只是本机C++源文件.从设计的角度看这是对的吗?!
为了做到这一点,我想我必须将托管C#dll文件添加到C++本机dll文件的其他#using Directories属性中.问题是我不知道如何根据当前配置设置C#dll调试或发布版本的路径.
另外我知道我不能将本机C++ DLL添加到C#项目引用中.但看起来我可以在本机C++项目中添加一个C#dll作为引用.怎么会 ?!这甚至有用吗?如果我可以将C#dll添加到本机C++项目引用中,是否需要设置#using目录?
我试图实现一个双向链表,其中节点存储在堆栈上,但堆上的节点数据.您可以使用push()将包含数据的新节点添加到列表中,并使用pop()删除最后一个元素.
我有push()方法的问题.
#include <iostream>
using namespace std;
struct Data {
string name;
int age;
};
struct Node {
struct Node *next;
struct Node *previous;
struct Data *d;
};
struct Node *first;
struct Node *last;
void init() {
first = last = NULL;
}
void push(Data d) {
Node *temp;
if(first == NULL){
first = new Node();
first->d = malloc(sizeof(struct Data *));
first->next = NULL;
first->previous = NULL;
last = first;
} else if(last->next == NULL) {
last->next = new Node(); …Run Code Online (Sandbox Code Playgroud) 对于一个项目,我正在尝试创建一个视频通话应用程序.我正在为通用Windows平台做这个,所以我想我可以使用MediaCapture类.这个类确实有这个StartRecordToCustomSinkAsync()方法,但是为了使用它,我需要创建一个自定义接收器.我开始创建一个,但现在我不得不创建流水槽.此链接解释了Media Sinks,但我找不到关于流接收器的任何文档.
我还研究了Simple Communication,WavSink和另一个自定义接收器示例,但代码缺少注释或解决了另一个问题.
有谁知道我如何实施UWP视频通话应用程序,或指出我正确的方向?
PS.我知道这类问题更多,但没有可用的答案:(
一般来说,我需要能够从我在编译时不知道的任何 DLL 中调用任何非托管函数。
我看到的所有文章(例如https://blogs.msdn.microsoft.com/jonathanswift/2006/10/03/dynamically-calling-an-unmanaged-dll-from-net-c/)都建议使用委托,但我在编译时不知道我要调用哪个函数,甚至不知道它需要哪些参数和多少参数。
基本上我有一个用户输入,如:调用“Kernel32.dll”函数“DeleteFile”参数[“C:\testfile.txt”]。
你能建议至少如何谷歌吗?“动态”这个词没有帮助..
任务本身有点疯狂,因为它实际上是一个大学项目。不确定它在现实生活中是否有用..
var dll = "kernel32.dll";
var fun = "DeleteFile";
var args = new object[] { "C:\\dev\\test.txt" };
IntPtr pDll = NativeMethods.LoadLibrary(dll);
IntPtr pFun = NativeMethods.GetProcAddress(pDll, fun);
// How can I call it in a different way, without having a delegate?
Marshal.GetDelegateForFunctionPointer(pFun, typeof(?????));
Run Code Online (Sandbox Code Playgroud) 我目前正在做一个项目,更准确地说是一个七巧板游戏。我有段错误问题,我不明白为什么。
鉴于我有一个完整的项目,我将尝试简化问题:我有一个 GameManager 类,其中特别包含一个 Menu 对象(和其他东西,但我认为这并不重要。gameManager 用于初始化这个对象并管理它。菜单包含一个按钮向量(每个按钮都有一个 lambda 来在用户单击它时执行操作)。
std::vector<std::unique_ptr<Button>> buttons;
Run Code Online (Sandbox Code Playgroud)
为了说明它是如何工作的,我将举一个例子:如果用户点击“加载”按钮,游戏管理器将删除菜单中包含的当前按钮并在该菜单中添加新按钮。
void GameManager::initMainMenuButtons() {
...
menu -> addButton(std::unique_ptr<Button>(new Button(x1, y1, x2, y2, "Create",
[this]{
std::cout << "Create level" << std::endl;
menu->clear()
initCreateLevelButtons();
actionManager->setMenu(menu);
}
)));
...
}
Run Code Online (Sandbox Code Playgroud)
在该代码示例中,我有一个方法 initMainMenuButtons 可以在菜单中添加几个按钮,例如“加载”或“退出”。当用户单击“创建”时,我想更改界面(添加和删除按钮)。所以,要删除按钮,我调用方法 clear()
void Menu::clear() {
buttons.clear();
decorationPieces.clear(); // not interesting
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 unique_ptr,因此,我不必手动删除按钮。到目前为止,没问题:按钮的向量似乎是空的(大小为 0)。接下来,调用方法 initCreateLevelButtons()。此方法与 initMainMenu 非常相似:它在菜单中添加按钮,仅此而已。在此调用期间,按钮似乎正确添加到矢量中,我在最后打印了矢量的内容,矢量包含正确的按钮。
在那里,问题出现了:在调用 initCreateLevelButtons() 之后,当我想使用菜单时会出现段错误,因此actionManager->setMenu(menu);不起作用。我尝试打印 menu std::cout << menu << std::endl,并测试此指针是否为 nullptr,但它也不起作用。我不明白为什么菜单在 initCreateLevelButtons() 的最后一行似乎是正确的,然后就无效了。如果我不清除按钮的矢量(菜单->清除指令),程序可以工作,但是,最后一个按钮仍然在这里)。
我尝试使用原始指针,我注意到只要按钮没有被删除,程序就能够清除向量(如果我添加一个循环来删除按钮,就会出现问题),所以,我得出的结论是问题是按钮删除。我不明白为什么,我被卡住了。我不知道我解释得好不好,因为,正如我已经说过的,代码是整个项目的一部分,很难在不引入其他东西的情况下引入类。如果您需要详细信息或方法的完整代码,我可以提供。
我正在使用gcc 9.2和cmake 3.15在 Linux 上构建 C++ 项目,并且需要增加默认堆栈大小。我之前找到了很多答案,但似乎都不起作用
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,1000000")
message(${CMAKE_CXX_COMPILER_ID})
message(${CMAKE_EXE_LINKER_FLAGS})
Run Code Online (Sandbox Code Playgroud)
它给出了一个错误:
/usr/bin/ld: unrecognized option '--stack'
/usr/bin/ld: use the --help option for usage information
Run Code Online (Sandbox Code Playgroud)
我可以看到参数确实是在 cmake 输出中传递的:
GNU
-Wl,--stack,1000000
Run Code Online (Sandbox Code Playgroud)
而下面这个标志似乎根本不存在。
set(CMAKE_CXX_STACK_SIZE 1000000)
Run Code Online (Sandbox Code Playgroud) 我在 C++ 领域工作了很多年,但对 CMake 还很陌生。
我用构建我的应用程序
cmake --build build_dir --config Debug --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)
这工作正常并构建调试版本。
如果我将 --config 更改为其他内容,例如使用以下命令发布:
cmake --build build_dir --config Release --target all -- -j 1
Run Code Online (Sandbox Code Playgroud)
忍者说“没有工作可做”并退出。运行编译后的应用程序,它显然没有得到优化。此 Cmake 项目中还有两个其他选项,RelWithDebug 和 MinSizeRel,它们的作用相同。
在CmakeLists.txt中有:
set(CMAKE_CONFIGURATION_TYPES "Release;Debug;MinSizeRel;RelWithDebInfo")
Run Code Online (Sandbox Code Playgroud)
还有很多其他提到的各种类型,但目前对我来说都有点希腊语。
我该怎么做才能找出问题出在哪里?