I’m trying to fix something in some Objective C++ (?!) code. I don’t know either of those languages, or any of the relevant APIs or the codebase, so I’m getting stymied left and right.
Say I have:
Vector<char, sizeof 'a'>& sourceData();
sourceData->append('f');
When i try to compile that, I get:
error: request for member ‘append’ in ‘WebCore::sourceData’, which is of non-class type ‘WTF::Vector<char, 1ul >& ()();
In this case, Vector is WTF::Vector (from WebKit or KDE or something), not STD::Vector. append() very much is supposed to be a member of class generated from this template, as seen in this documentation. It’s a Vector. It takes the type the template is templated on.
Now, because I never write programs in Real Man’s programming languages, I’m hella confused about the notations for references and pointers and dereferences and where we need them.
I ultimately want a Vector reference, because I want to pass it to another function with the signature:
void foobar(const Vector<char>& in, Vector<char>& out)
I’m guessing the const in the foobar() sig is something I can ignore, meaning ‘dont worry, this won’t be mangled if you pass it in here’.
I’ve also tried using .append rather than -> because isn’t one of the things of C++ references that you can treat them more like they aren’t pointers? Either way, its the same error.
I can’t quite follow the error message: it makes it sound like sourceData is of type WTF:Vector<char, 1ul>&, which is what I want. It also looks from the those docs of WTF::Vector that when you make a Vector of something, you get an .append(). But I’m not familiar with templates, either, so I can’t really tell i I’m reading that right.
EDIT:
(This is a long followup to Pavel Minaev)
WOW THANKS PROBLEM SOLVED!
I was actually just writing an edit to this post that I semi-figured out your first point after coming across a reference on the web that that line tells the compiler your forward declaring a func called sourceData() that takes no params and returns a Vector of chars. so a “non-class type” in this case means a type that is not an instance of a class. I interpreted that as meaning that the type was not a ‘klass’, i.e. the type of thing you would expect you could call like .addMethod(functionPointer).
Thanks though! Doing what you suggest makes this work I think. Somehow, I’d gotten it into my head (idk from where) that because the func sig was vector&, I needed to declare those as &’s. Like a stack vs. heap pass issue.
Anyway, that was my REAL problem, because I tried what you’d suggested about but that doesn’t initialize the reference. You need to explicitly call the constructor, but then when I put anything in the constructor’s args to disambiguate from being a forward decl, it failed with some other error about ‘temporary’s.
So in a sense, I still don’t understand what is going on here fully, but I thank you heartily for fixing my problem. if anyone wants to supply some additional elucidation for the benefit of me and future google people, that would be great.
This:
has declared a global function which takes no arguments and returns a reference to
Vector. The namesourceDatais therefore of function type. When you try to access a member of that, it rightfully complains that it’s not a class/struct/union, andoperator->is simply inapplicable.To create an object instead, you should omit the parentheses (they are only required when you have any arguments to pass to the constructor, and must be omitted if there are none):
Then you can call append:
Note that dot is used rather than
->because you have an object, not a pointer to object.You do not need to do anything special to pass
sourceDatato a function that wants aVector&. Just pass the variable – it will be passed by reference automatically: