मेरे पास मेरे सी ++ 11 एक्सकोड प्रोजेक्ट में टेम्पलेट किए गए फ़ंक्शन हैं और उनमें से कुछ में विशेषज्ञता है। हालांकि, मैंने पाया है कि विशेषज्ञता केवल डीबग बिल्ड में बुलाया जाता है; अगर मैं रिलीज में निर्माण करता हूं, तो उन्हें नजरअंदाज कर दिया जाता है।मेरा विशेष टेम्पलेट फ़ंक्शन केवल डीबग बिल्ड में क्यों लागू होता है?
मैं सफलतापूर्वक एक बहुत ही सरल उदाहरण बनाया है:
special.h
#include <cstdio>
struct special
{
template<typename T>
void call(const T&) { puts("not so special"); }
};
special.cpp
#include "special.h"
#include <string>
template<>
void special::call(const std::string&) { puts("very special"); }
main.cpp
#include "special.h"
#include <string>
int main()
{
std::string str = "hello world";
special s;
s.call(123);
s.call(str);
}
You can download the project (जब तक कहीं 2013 की गर्मियों में कम से कम) समस्या को ठीक करने अगर आप इसे अपने आप को बनाने के लिए नहीं करना चाहती। पहले डीबग कॉन्फ़िगरेशन के साथ प्रोजेक्ट चलाएं, फिर इसे रिलीज़ में फिर से चलाएं। उत्पादन है कि मैं उम्मीद है:
ऐसी क्या खास बात नहीं
बहुत ही खास
और यह वास्तव में है क्या मैं डीबग बिल्ड विन्यास के साथ मिलता है। हालांकि, रिलीज के साथ, मैं इस मिल:
ऐसी क्या खास बात
ऐसी क्या खास बात नहीं
special.cpp में special::call
के विशेष कार्यान्वयन जिसका मतलब है नजरअंदाज कर दिया गया नहीं।
परिणाम असंगत क्यों है? यह सुनिश्चित करने के लिए मुझे क्या करना चाहिए कि रिलीज बिल्ड में विशेष कार्य कहा जाता है?
इसे .cpp के बजाय .h में रखें? – Pubby
special.cpp दोनों मामलों में जुड़ा हुआ है? – ForEveR
हां, special.cpp संकलित और दोनों मामलों में जुड़ा हुआ है। अगर मैं हेडर फ़ाइल में विशेषज्ञता डालता हूं, तो यह काम करता है अगर फ़ाइल केवल एक .cpp फ़ाइल में शामिल है, लेकिन अन्यथा मुझे डुप्लिकेट प्रतीक त्रुटि मिलती है। – zneak