पर विचार करें निम्नलिखित कोड का नेस्टेड वर्ग:सी ++: एक टेम्पलेट वर्ग
template < typename T >
struct A
{
struct B { };
};
template < typename T >
void f(typename A<T>::B) { }
int main()
{
A<int>::B x;
f(x); // fails for gcc-4.1.2
f<int>(x); // passes
return 0;
}
तो यहाँ जीसीसी-4.1.2 f
के टेम्पलेट तर्क को स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता है। क्या यह मानक मिलती है? क्या जीसीसी के नए संस्करणों में यह समस्या तय है? f
पर कॉल करते समय मैं स्पष्ट रूप से int
निर्दिष्ट करने से कैसे बच सकता हूं?
अद्यतन: यहां एक कामकाज है।
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_same.hpp>
template < typename T >
struct A
{
typedef T argument;
struct B { typedef A outer; };
};
template < typename T >
void f(typename A<T>::B) { }
template < typename Nested >
void g(Nested)
{
typedef typename Nested::outer::argument TT;
BOOST_STATIC_ASSERT((boost::is_same< typename A<TT>::B, Nested >::value));
}
struct NN
{
typedef NN outer;
typedef NN argument;
};
int main()
{
A<int>::B x;
NN y;
g(x); // Passes
g(y); // Fails as it should, note that this will pass if we remove the type check
f(x); // Fails as before
return 0;
}
हालांकि, मैं अभी भी नहीं देख सकता कि क्यों f(x);
कॉल अवैध है। क्या आप मानक में कुछ बिंदु देख सकते हैं जो कहता है कि ऐसी कॉल अमान्य होनी चाहिए? क्या आप एक उदाहरण ला सकते हैं जहां ऐसी कॉल संदिग्ध है?
आपके उत्तर के लिए धन्यवाद। फ़ंक्शन तर्क से 'टी' क्यों नहीं लिया जा सकता है? क्या आप एक उदाहरण ला सकते हैं जहां 'टी' के लिए दो प्रकार हैं जो 'एफ' के एक विशेष कॉल के लिए मेल खाते हैं? क्या आपका मतलब है कि 'ए' की एक और विशेषज्ञता के लिए यह 'स्ट्रक्चर बी {}; 'के बजाय' typedef int b' हो सकता है? मैं नहीं देख सकता कि इस मामले में क्यों 'एफ' का आह्वान अस्पष्ट होना चाहिए। – Vahagn