Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6157645
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 23, 20262026-05-23T20:49:15+00:00 2026-05-23T20:49:15+00:00

In answering this question, I came across this difference in behaviour with respect to

  • 0

In answering this question, I came across this difference in behaviour with respect to template instantiation.

Initially there is a function template

template <typename T> void my_callback(void* data) { … }

Now something requires the address of this – specifically a void*, so the obvious approach is

bar(reinterpret_cast<void*>(&my_callback<int>));

However, with compiler versions pre gcc 4.5, this fails with a not-enough context… error. Fine – so the fix is to “cast” first – which forces instantiation, i.e:

void (*callback)(void*) = my_callback<int>;
bar(reinterpret_cast<void*>(callback));

This works fine.

Now the second scenario, rather than being a free function, it’s a static member of a class template, i.e.

template <typename T>
struct foo
{
  static void my_callback(void* data) {
    T& x = *static_cast<T*>(data);
    std:: cout << "Call[T] with " << x << std::endl;
  }
};

Now, the original reinterpret_cast works fine.

bar(reinterpret_cast<void*>(&foo<int>::my_callback));

So my question is – why this apparent difference in behaviour?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-23T20:49:16+00:00Added an answer on May 23, 2026 at 8:49 pm

    From n3290, 14.7.1 Implicit instantiation [temp.inst]

    2 Unless a function template specialization has been explicitly
    instantiated or explicitly specialized, the function template
    specialization is implicitly instantiated when the specialization is
    referenced in a context that requires a function definition to exist.

    There are similar rules in paragraph 1 for class template specializations. Notice that the Standard speaks in terms of specialization because a specialization is implicitly declared when a template is used an no user-provided specialization is here, at least for function templates (paragraph 8).

    Combined with paragraph 10,

    10 An implementation shall not implicitly instantiate a function
    template, a member template, a non-virtual member function, a member
    class, or a static data member of a class template that does not
    require instantiation.

    I think the rule of thumb is: as soon as an object/class member/function is needed or to make the program otherwise work (speaking informally), the template is implicitly instantiated but no sooner. This include taking the address of a function.

    As to the question you linked, some uses of reinterpret_cast may make the program non-conformant, by which time it’s irrelevant to mention instantiations — I invite you to see my answer there</shameless>.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

While answering this question I came across an interesting difference in the overload resolution
In answering this question , I came across a situation that I don't understand.
This came up when answering another user's question (TheSoftwareJedi)... Given the following table: ROW_PRIORITY
In answering this question ( https://stackoverflow.com/questions/352317/c-coding-question#352327 ), it got me wondering... Is there any
In answering this code golf question , I ran across a problem in my
Kicking around some small structures while answering this post , I came across the
As part of answering another question, I came across a piece of code like
After answering this question I was trying to find is_complete template in Boost library
There are many questions related to Stackless Python. But none answering this my question,
While answering this question I noticed that I have never come across any property

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.