gpt4 book ai didi

.net - 托管 C++ 中未解析的 token

转载 作者:行者123 更新时间:2023-12-01 12:02:00 25 4
gpt4 key购买 nike

我手上有一个谜。我正在尝试学习来自 C# 背景的托管 C++,但遇到了麻烦。如果我有一个包含两个类的项目,一个基类 Soup 和一个派生类 TomatoSoup,我将其编译为静态库 (.lib),我会在Soup 中的虚方法。这是代码:


摘要.proj

Soup.h

namespace Abstracts
{
public ref class Soup abstract
{
public:
virtual void heat(int Degrees);
};
}

TomatoSoup.h

#include "Soup.h"

namespace Abstracts
{
public ref class TomatoSoup : Abstracts::Soup
{
public:
virtual void heat(int Degrees) override;
};
}

TomatoSoup.cpp

#include "TomatoSoup.h"

void Abstracts::TomatoSoup::heat(int Degrees)
{
System::Console::WriteLine("Soup's on.");
}

主程序

main.cpp

#include "TomatoSoup.h"

using namespace System;

int main(array<System::String ^> ^args)
{
Abstracts::TomatoSoup^ ts = gcnew Abstracts::TomatoSoup();

return 0;
}

我在 Main.proj 上遇到此链接时错误:

1>Main.obj : error LNK2020: unresolved token (06000001) Abstracts.Soup::heat
  1. 我试过设置

    virtual void heat(int Degrees)=0;
  2. 我已经尝试在基类中实现 heat

    virtual void heat(int Degrees){} 

    并得到一个未引用的正式文件参数警告被视为错误。

  3. 我已经用 and 尝试了 1 和 2没有 abstract 关键字汤类

这个问题快把我逼疯了,我希望以后能防止它把其他开发者逼疯。

更新:当在头文件中实现 TomatoSoup::heat 时,这适用于 Greg Hewgill 的参数名称注释方法,但当我将实现移至 TomatoSoup.cpp 时,错误又回来了。我修改了问题以反射(reflect)这一点。

最佳答案

您遇到的错误 (LNK2020) 意味着链接器无法在任何地方找到 Abstracts.Soup::heat 函数的定义。当您将函数声明为 virtual void heat(int Degrees); 时,链接器将期望在某处找到定义的函数体。

如果您不打算提供函数体,并且要求子类最终重写该函数,您应该按照解决方案 1 中的说明进行操作:

virtual void heat(int Degrees) = 0;

这告诉编译器您不打算实现该函数。当你这样做时会发生什么?

另外,引用你的第二个解决方案:

virtual void heat(int Degrees) {}

编译器告诉您您没有在函数中引用 Degrees 参数。在 C++ 中避免此警告的一种方法是不给参数命名:

virtual void heat(int /*Degrees*/) {}

不过,提供空实现与纯虚拟 (= 0) 声明有点不同。

关于.net - 托管 C++ 中未解析的 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com