Tôi có mã tìm và in ra các mẫu trùng khớp khi đi qua vùng chứa các chuỗi. In được thực hiện trong chức năng foo được templated
Mật mã
#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;
}
Khi biên dịch, tôi đã gặp phải một lỗi rằng các kiểu khấu trừ đã thất bại do sự không nhất quán của các trình vòng lặp được cung cấp, các kiểu của chúng hóa ra rất đa dạng.
Lỗi biên dịch GCC :
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.
Đầu ra của Clang :
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)
Tôi không bắt được gì? Việc sử dụng các kiểu mẫu của tôi có bị sai và xuất hiện lạm dụng theo quan điểm của tiêu chuẩn không? Cả g ++ - 9.2 với listdc ++ 11 cũng không clang ++ với libc ++ đều có thể biên dịch cái này.
-std=c++17
và trên Clang với-std=c++17
-frelaxed-template-template-args
cờ. Nếu không , có vẻ như bạn cần một tham số mẫu khác cho bộ cấp phát.