
From: David Abrahams <dave@boost-consulting.com>
Rob Stewart wrote:
From: "Yuval Ronen" <ronen_yuval@yahoo.com>
But you can't. You have to write the following, as I showed above:
int a = some_any.template get<int>();
?? There are no dependent types in that utterance. Unless some_any is not known to be a boost::any (?) Am I missing something?
I tried to track down the relevant section in the standard to confirm what I wrote, but I couldn't. I was relying on C++PL, 3rd Ed, App C, section C.13.6, "Template as a Qualifier." The example is (reduced): struct Memory { template <typename T> T * get_new(); }; template <typename Allocator> void f(Allocator & m) { int * p1 = m.get_new<int>(); // error int * p2 = m.template get_new<int>(); } This Memory::get_new() is used within a function template, but Stroustrup doesn't mention that it is precisely because get_new() is dependent that "template" is needed, so I didn't think that it was a dependent type. Thinking further, I realized that m.get_new<int>() actually means m.Allocator::get_new<int>(), so I now see that it is a dependent type according to 14.6.2.1/1. In the OP's case, the invoked member function would be any<T>'s, not T's, so it isn't dependent and "template" isn't needed, which is what you implied. -- Rob Stewart stewart@sig.com Software Engineer http://www.sig.com Susquehanna International Group, LLP using std::disclaimer;