আমি সবেমাত্র g ++ 4.7 (পরে একটি স্ন্যাপশটগুলির সাথে) -std = c ++ 11 সক্ষম করে খেলছিলাম। আমি আমার বিদ্যমান কোড বেইজ এবং এমন একটি মামলা সংকলন করার চেষ্টা করেছি যা কিছুটা ব্যর্থ হয়েছিল আমাকে বিভ্রান্ত করে।
কেউ কী চলছে তা ব্যাখ্যা করতে পারলে আমি প্রশংসা করব।
কোডটি এখানে:
#include <utility>
#include <iostream>
#include <vector>
#include <string>
int main ( )
{
std::string s = "abc";
// 1 ok
std::pair < std::string, int > a = std::make_pair ( s, 7 );
// 2 error on the next line
std::pair < std::string, int > b = std::make_pair < std::string, int > ( s, 7 );
// 3 ok
std::pair < std::string, int > d = std::pair < std::string, int > ( s, 7 );
return 0;
}
আমি বুঝি যে make_pair হয় অভিপ্রেত (1) যদি (যদি আমি ধরনের উল্লেখ, তারপর আমি ভাল হিসাবে ব্যবহার হতে পারে (3)) হিসাবে ব্যবহার করা যেতে, কিন্তু আমি বুঝতে পারছি না কেন এটা এই ক্ষেত্রে ব্যর্থ হচ্ছে।
সঠিক ত্রুটিটি হ'ল:
test.cpp: In function ‘int main()’:
test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’
test.cpp:11:83: note: candidate is:
In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/utility:72:0,
from test.cpp:1:
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
/gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5:
note: template argument deduction/substitution failed:
test.cpp:11:83: note: cannot convert ‘s’ (type ‘std::string {aka std::basic_string<char>}’) to type ‘std::basic_string<char>&&’
আবার, এখানে প্রশ্নটি কেবল "কী হচ্ছে?" আমি জানি যে আমি টেমপ্লেটের স্পেসিফিকেশন সরিয়ে সমস্যার সমাধান করতে পারি তবে আমি কভারের আওতায় এখানে কী ব্যর্থ হচ্ছে তা জানতে চাই।
- g ++ 4.4 কোনও সমস্যা ছাড়াই এই কোডটি সংকলন করে।
- -Std = c ++ 11 মুছে ফেলাও কোনও সমস্যা ছাড়াই কোড সহ কম্পাইল করে।
std::vector
অনুরূপ সি ++ 11 এ সূক্ষ্ম ব্রেকিং পরিবর্তনের আরও একটি উদাহরণ । কমপক্ষে এটি একটি সংকলক ত্রুটি দেয় এবং শব্দার্থবিজ্ঞানের নীরব পরিবর্তন নয়।