From: Arthur Schwarz <home@slipbits.com>
To: Jonathan Wakely <jwakely.gcc@gmail.com>
Cc: gcc-help@gcc.gnu.org
Subject: Re: Can you use a function reference passed in a template argument?
Date: Thu, 9 Nov 2023 13:24:50 -0800 [thread overview]
Message-ID: <7780aa57-1761-475b-9e09-b05d8867ea04@slipbits.com> (raw)
In-Reply-To: <CAH6eHdQw7dX9ZmV9NpcwFOeYvM6zK6WR20zTjmzqLd_hbLhZ6w@mail.gmail.com>
On 11/9/2023 1:11 PM, Jonathan Wakely via Gcc-help wrote:
> On Thu, 9 Nov 2023 at 20:46, Arthur Schwarz <home@slipbits.com> wrote:
>>
>> Is there any way to use a function passed as an argument to a template
>> (example below)? Couldn't the existence of the referenced function be
>> established durint instantiation (Stack<some class> obj)? I realize that
>> just doing analysis of the template that the existence of a referenced
>> function can't be determined, but during instantiation it can be validated.
> I have no idea what that code is trying to do. You're trying to call a
> member function on a _type_ T.
As if I knew what I was trying to do.
>
> And you said you want to call a function passed as an argument ... but
> the template argument you pass is a type, not a function.
>
At the time of object instantiation the 'type' is a class and as a
member of this
class there is a function. It is resolvable that when a class is used
that to satisfy
the requirement that the template object is correct, the class must
contain the
indicated function. If a passed class does not contain the indicated
function,
then an error can be generated.
It looks like the determination of template instantiability is made when
the
template is 'compiled', and at this time it is not possible to determine
that
the referenced function, T.fun(), is available. This validation only
becomes
possible during template instantiation, that is, when
template_name<class_name>
is instantiated. To me the question then becomes does the standard require
that checking is not deferred until instantiation.
>> As a nit, the repeated instances of "../header/" in the error message is
>> an annoyance.
> That looks like a problem with symlinks or your build system, not gcc's fault.
>
>> Diagnostic message and code given below.
>>
>> thanks
>> art
>>
>> ../header/../header/../header/../header/Stack.h: In member function
>> ‘std::string Stack<T>::toString()’:
>> ../header/../header/../header/../header/Stack.h:184:46: error: expected
>> primary-expression before ‘.’ token
>> 184 | str << setw(3) << s.size() << ": " << T.toString();
>> | ^
>>
>> # include <iomanip>
>> # include <sstream>
>>
>> using namespace std;
>> template <class T>
>> class Stack {
>> string toString() {
>> stringstream str;
>> str << setw(3) << s.size() << ": " << T.toString();
>> return str.str();
>> };
>> };
>>
next prev parent reply other threads:[~2023-11-09 21:24 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-09 20:46 Arthur Schwarz
2023-11-09 21:02 ` Thomas Bleher
2023-11-09 21:07 ` Arthur Schwarz
2023-11-09 21:11 ` Jonathan Wakely
2023-11-09 21:24 ` Arthur Schwarz [this message]
2023-11-09 21:58 ` Jonathan Wakely
2023-11-09 22:00 ` Jonathan Wakely
2023-11-09 22:10 ` Arthur Schwarz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7780aa57-1761-475b-9e09-b05d8867ea04@slipbits.com \
--to=home@slipbits.com \
--cc=gcc-help@gcc.gnu.org \
--cc=jwakely.gcc@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).