मेरे पास कोड है जो स्ट्रिंग्स के कंटेनर के ऊपर जाकर एक पैटर्न के मैचों को ढूंढता है और प्रिंट करता है। टेम्पू में फंक्शन फू में प्रिंटिंग की जाती है
कोड
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <string>
#include <tuple>
#include <utility>
template<typename Iterator, template<typename> class Container>
void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings)
{
for (auto const &finding : findings)
{
std::cout << "pos = " << std::distance(first, finding.first) << " ";
std::copy(finding.first, finding.second, std::ostream_iterator<char>(std::cout));
std::cout << '\n';
}
}
int main()
{
std::vector<std::string> strs = { "hello, world", "world my world", "world, it is me" };
std::string const pattern = "world";
for (auto const &str : strs)
{
std::vector<std::pair<std::string::const_iterator, std::string::const_iterator>> findings;
for (std::string::const_iterator match_start = str.cbegin(), match_end;
match_start != str.cend();
match_start = match_end)
{
match_start = std::search(match_start, str.cend(), pattern.cbegin(), pattern.cend());
if (match_start != match_end)
findings.push_back({match_start, match_start + pattern.size()});
}
foo(str.cbegin(), findings);
}
return 0;
}
संकलित करते समय मुझे एक त्रुटि मिली है कि पुनरावृत्तियों की असंगतता के कारण प्रकार कटौती विफल हो गई है, उनके प्रकार विविध होते हैं।
जीसीसी संकलन त्रुटि:
prog.cpp:35:9: error: no matching function for call to 'foo'
foo(str.cbegin(), findings);
^~~
prog.cpp:10:6: note: candidate template ignored: substitution failure [with Iterator = __gnu_cxx::__normal_iterator<const char *, std::__cxx11::basic_string<char> >]: template template argument has different template parameters than its corresponding template template parameter
void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings)
^
1 error generated.
क्लैंग का उत्पादन:
main.cpp:34:9: error: no matching function for call to 'foo'
foo(str.cbegin(), findings);
^~~
main.cpp:9:6: note: candidate template ignored: substitution failure [with Iterator = std::__1::__wrap_iter<const char *>]: template template argument has different template parameters than its corresponding template template parameter
void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings)
मैं क्या नहीं पकड़ रहा हूँ? क्या खाका टेम्पलेट प्रकारों का मेरा उपयोग गलत है और मानक दृष्टिकोण से दुरुपयोग दिखाई देता है? न तो जी ++ - 9.2 के साथ listdc ++ 11 है और न ही बजना ++ साथ libc ++ इस संकलन करने में सक्षम हैं।
-std=c++17
और Clang पर GCC पर काम करता है-std=c++17
-frelaxed-template-template-args
। अन्यथा ऐसा लगता है कि आपको आवंटनकर्ता के लिए एक और टेम्पलेट पैरामीटर की आवश्यकता है।