আমার কাছে কোড রয়েছে যা স্ট্রিংয়ের ধারকটির উপরে চলে যাওয়ার মতো একটি প্যাটার্নের ম্যাচগুলি খুঁজে বের করে এবং মুদ্রণ করে। প্রিন্টিং ফাংশন ফুতে সঞ্চালিত হয় যা প্রেরিত হয়
কোড
#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
সহ জিসিসিতে এবং সংঘর্ষে কাজ করে-std=c++17
-frelaxed-template-template-args
। অন্যথায় মনে হচ্ছে বরাদ্দকারীর জন্য আপনার আর একটি টেম্পলেট প্যারামিটার প্রয়োজন।