(Obj)C ++:从模板实例化(引用)类,访问其成员?

时间:2009-07-10 22:15:02

标签: c++ objective-c templates

我正在尝试修改一些Objective C ++(?!)代码。我不知道这些语言,或任何相关的API或代码库,所以我受到左右阻碍。

说我有:

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

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

  

错误:请求'WebCore :: sourceData'中的成员'append',这是非类型'WTF :: Vector&lt; char,1ul&gt;&amp; ()();

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

现在,因为我从不用Real Man的编程语言编写程序,所以我对于引用,指针和引用的符号以及我们需要它们的位置感到困惑。

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

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

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

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

我不能完全遵循错误消息:它听起来像源数据类型为WTF:Vector&lt; char,1ul&gt;&amp;,这就是我想要的。它也从WTF :: Vector的那些文档看起来,当你创建一个Vector的东西时,你得到一个.append()。但我也不熟悉模板,所以我不能说我正在读那个。

编辑:

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

我实际上只是在写一篇关于这篇文章的编辑,我在网上看到这条线后告诉编译器你的前方声明一个名为sourceData()的函数没有参数返回一个字符向量。所以在这种情况下,“非类型”表示不是类的实例的类型。我认为这意味着类型不是'klass',即你期望你可以调用的类型.addMethod(functionPointer)。

谢谢!按照你的建议做我认为这项工作。不知怎的,我已经把它放到我的脑海里(从哪里开始),因为func sig是vector&amp;,我需要将它们声明为&amp;'s。就像堆栈与堆传递问题一样。

无论如何,那是我的真正问题,因为我尝试了你的建议,但没有初始化引用。你需要显式地调用构造函数,但是当我在构造函数的args中放置任何东西以消除前向decl的歧义时,它失败了一些关于'temporary'的其他错误。

所以从某种意义上说,我仍然不明白这里发生了什么,但我衷心感谢你解决我的问题。如果有人想为我和未来的谷歌人提供一些额外的说明,那就太棒了。

2 个答案:

答案 0 :(得分:2)

此:

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

声明了全局函数,该函数不带参数并返回对Vector的引用。因此,名称sourceData是函数类型。当你试图访问其成员时,它理所当然地抱怨它不是类/结构/联合,并且operator->根本不适用。

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

 Vector<char, sizeof 'a'> sourceData;

然后你可以打电话给追加:

 sourceData.append('f');

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

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

 foobar(sourceData, targetData);

答案 1 :(得分:0)

用C ++蘸你的脚趾从来都不是很有趣。在这种情况下,你遇到了几个经典错误。首先,您要在堆栈上创建Vector的实例。在这种情况下,空()被解释为一个名为sourceData的函数的声明,它不接受任何agruments并返回对Vector的引用。编译器抱怨生成的函数不是类(它不是)。要改为创建Vector的实例,请在没有()的情况下声明实例并删除&。只有在将参数传递给实例构造函数时才需要括号,如果没有参数则必须省略括号。

你想要

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

Vector<char, sizeof 'a'> outData; //if outData is not instantiated already

foobar(sourceData, outData);

This维基百科文章对C ++参考文献进行了很好的介绍。