c++ - (Obj) C++ : Instantiate (reference to) class from template, 访问其成员?

标签 c++ objective-c templates

我正在尝试修复某些 Objective C++(?!)代码中的某些内容。我不知道这些语言中的任何一种,也不知道任何相关的 API 或代码库,所以我左右为难。

假设我有:

Vector<char, sizeof 'a'>& sourceData();
sourceData->append('f');

当我尝试编译它时,我得到:

error: request for member 'append' in 'WebCore::sourceData', which is of non-class type 'WTF::Vector<char, 1ul >& ()();

在这种情况下,Vector 是 WTF::Vector(来自 WebKit 或 KDE 或其他东西),而不是 STD::Vector。 append() 非常应该是从此模板生成的类的成员,如所见 in this documentation .它是一个 vector 。它采用模板模板化的类型。

现在,因为我从来没有用 Real Man 的编程语言编写程序,所以我对引用、指针和解引用的符号以及我们需要它们的地方感到非常困惑。

我最终想要一个 Vector 引用,因为我想将它传递给另一个具有签名的函数:

void foobar(const Vector<char>& in, Vector<char>& out)

我猜 foobar() sig 中的 const 是我可以忽略的东西,意思是“别担心,如果你在这里传递它,它不会被破坏”。

我也尝试过使用 .append 而不是 -> 因为 C++ 引用不是您可以更像对待指针一样对待它们的东西之一吗?无论哪种方式,都是同样的错误。

我不太理解错误消息:它听起来像是 sourceData 的类型 WTF:Vector&,这正是我想要的。从 WTF::Vector 的那些文档中也可以看出,当你制作某个东西的 Vector 时,你会得到一个 .append()。但我也不熟悉模板,所以我不能确定我没看错。

编辑:

(这是对 Pavel Minaev 的长期跟进) 哇,谢谢,问题解决了!

我实际上只是对这篇文章进行了编辑,在网上看到一个引用后,我半弄清楚了你的第一点,该行告诉编译器你的前向声明了一个名为 sourceData() 的函数,它不带参数和返回一个字符 vector 。所以在这种情况下,“非类类型”意味着不是类的实例的类型。我将其解释为意味着该类型不是“klass”,即您希望可以像 .addMethod(functionPointer) 这样调用的类型。

谢谢!我认为按照您的建议进行这项工作。不知何故,我已经把它记在脑子里了(idk 从哪里来的)因为 func sig 是 vector&,所以我需要将它们声明为 &'s。就像堆栈与堆传递问题。

无论如何,那是我真正的问题,因为我尝试了您的建议,但没有初始化引用。您需要显式调用构造函数,但是当我在构造函数的 args 中放入任何内容以消除前向声明的歧义时,它失败了,并出现了一些关于“临时”的其他错误。

所以在某种意义上,我仍然不完全理解这里发生了什么,但我衷心感谢您解决了我的问题。如果有人想为我和 future 的 Google 员工提供一些额外的说明,那就太好了。

最佳答案

这个:

 Vector<char, sizeof 'a'>& sourceData();

声明了一个全局函数,它不接受参数并返回对Vector 的引用。因此,名称 sourceData 是函数类型。当您尝试访问其中的一个成员时,它理所当然地提示它不是一个类/结构/union ,并且 operator-> 根本不适用。

要改为创建一个对象,您应该省略括号(只有当您有任何参数要传递给构造函数时才需要括号,如果没有则必须省略):

 Vector<char, sizeof 'a'> sourceData;

然后你可以调用追加:

 sourceData.append('f');

请注意,使用点而不是 ->,因为您有一个对象,而不是指向对象的指针。

您无需执行任何特殊操作即可将 sourceData 传递给需要 Vector& 的函数。只需传递变量 - 它会自动通过引用传递:

 foobar(sourceData, targetData);

关于c++ - (Obj) C++ : Instantiate (reference to) class from template, 访问其成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1112254/

相关文章:

c++ - 具有非类型模板参数的函数模板中的 static_assert

visual-studio - Visual Studio 项目模板在外部目录中创建解决方案文件

c++ - 在 C++ 字符串中编写单个选项卡时打印双选项卡

python - 如何从 django templatetag 访问 python 列表?

c++ - 将标题添加到大文件的最佳方法是什么

objective-c - NSTextView复制粘贴问题

ios - 静态快速​​操作在 Objective C iOS 中不起作用

ios - 如何在 xcode 的单 View 应用程序中创建带有按钮的方向键

c++ - 在 MFC 中设置 UI 标题时出错

c# - 在 C++ 中,我可以有一个函数/方法通过引用传递一个参数,而一个重载通过值传递它吗?