आप एक टेम्प्लेटेड क्लास की घोषणा कर सकते हैं, जिसकी परिभाषा में डिफॉल्ट तर्क दिए गए हैं, लेकिन जब भी आप क्लास को संदर्भित करते हैं, तो आपको इसके सभी तर्कों को तब तक शामिल करना चाहिए जब तक कि परिभाषा पेश नहीं की जाती।
जैसे। std::vectorइसे शामिल किए बिना उपयोग करें ( std::vectorडिफ़ॉल्ट के साथ दूसरा तर्क परिभाषित किया गया है):
namespace std
{
template<typename, typename>
class vector;
}
#include <iostream>
template <typename S, typename T>
void Foo (const std::vector<S,T> & vector)
{
std::cout << "do vector stuff, eg., display size = "
<< vector.size() << std::endl;
}
template <typename T>
void Foo (const T & t)
{
std::cout << "do non-vector stuff..." << std::endl;
}
हम तो बिना वेक्टर सहित इसका उपयोग कर सकते हैं, जैसे:
int main()
{
Foo(3);
}
और हम इसे उपयोग कर सकते हैं के साथ std::vector , जैसे .:
#include <vector>
// Now the compiler understands how to handle
// std::vector with one argument
// (making use of its default argument)
int main()
{
Foo(std::vector<int>(3));
}
मैं मानकों, लेकिन यह काम करता है की जाँच नहीं की है clang/ gccके साथ -std=c++98अप करने के लिए -std=c++17, इसलिए यदि यह आधिकारिक तौर पर एक मानक नहीं है तो यह अनधिकृत रूप से तो लग रहा है।