আমি স্টাইলের কিছু ধারক মুদ্রণের জন্য একটি ফাংশন টেম্পলেট তৈরি করেছি
#include <iostream>
#include <vector>
#include <string>
template <template <typename, typename> class C, typename T, typename A>
std::ostream& operator<<(std::ostream& os, const C<T, A>& container)
{
for (auto& elem : container)
{
os << elem << " ";
}
return os;
}
int main()
{
std::vector<std::string> v { "One", "Two", "Three" };
std::cout << v << std::endl;
return 0;
}
এটি এমএসভিসি, কলং এবং আইসিসিতে প্রত্যাশার মতো সংকলন এবং কাজ করে তবে জিসিসি (ট্রাঙ্ক) সংকলনের সময় operator<<
এটি লাইনের জন্য একটি দ্ব্যর্থক ত্রুটি দেয় os << elem << " "
। এমনকি এই ত্রুটিটি শুধুমাত্র পতাকাটি -std=c++17
বা সংকলনের সময় উপস্থিত হয় -std=c++2a
।
ত্রুটিটি যুক্তিসঙ্গত বলে মনে হচ্ছে std::string
, যেহেতু সংকলকটি একটি বিদ্যমান ফাংশন টেম্পলেট সনাক্ত করে যা বৈশ্বিক পক্ষে operator<<
একটি আউটপুট স্ট্রিম এবং একটি গ্রহণ করে basic_string<CharT, Traits, Allocator>
, Allocator
টাইপটির সাথে ডিফল্ট হয়ে থাকে std::allocator
।
আমার প্রশ্নটি হ'ল এটি কেন অন্য 3 সংকলকের সাথে সংকলন করে এবং কাজ করে, আমার বুদ্ধি থেকে, ক্ল্যাং কমপক্ষে, লিনাক্সে জিসিসি হিসাবে একই স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়ন ব্যবহার করে, সুতরাং এতে একই ফাংশন টেম্পলেট রয়েছে operator<<
ত্রুটিটি রিপোর্ট করা হয়েছে
error: ambiguous overload for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'const std::__cxx11::basic_string<char>')
এবং দুই প্রার্থী
note: candidate: 'std::ostream& operator<<(std::ostream&, const C<T, A>&) [with C = std::__cxx11::basic_string; T = char; A = std::char_traits<char>; std::ostream = std::basic_ostream<char>]'
note: candidate: 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const std::__cxx11::basic_string<_CharT, _Traits, _Allocator>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'
জিসিসি, কলং এবং আইসিসির জন্য সংকলক যুক্তি
-std=c++2a -O3 -Wall -Wextra -Wpedantic -Werror
এমএসভিসির জন্য একটি
/std:c++latest /O2 /W3
বাধ্যতামূলক গডবোল্ট লিঙ্ক: https://godbolt.org/z/R_aSKR