টু স্ট্রিং স্ট্যান্ডের সদস্য নয়, বলেছেন জি ++ (মিংডাব্লু)


245

আমি একটি ছোট শব্দভাণ্ডার মনে রাখার প্রোগ্রাম তৈরি করছি যেখানে শব্দগুলি এলোমেলোভাবে অর্থের জন্য ঝলকানো হবে। আমি স্ট্যান্ডার্ড সি ++ লাইব্রেরিটি ব্যবহার করতে চাই যেমন বাজরান স্ট্রুস্ট্রুপ আমাদের বলে, তবে গেটের ঠিক বাইরে আমি একটি আপাতদৃষ্টিতে অদ্ভুত সমস্যার মুখোমুখি হয়েছি।

আমি কোনও longপূর্ণসংখ্যাটি std::stringএমনভাবে পরিবর্তন করতে চাই যাতে এটি কোনও ফাইলে সংরক্ষণ করতে সক্ষম হয়। আমি to_string()একই জন্য নিযুক্ত করেছি । সমস্যাটি হ'ল, যখন আমি এটিকে g ++ (সংস্করণ 4.7.0 এর সাথে - সংস্করণ পতাকায় উল্লিখিত) দিয়ে সংকলন করি তখন এটি বলে:

PS C:\Users\Anurag\SkyDrive\College\Programs> g++ -std=c++0x ttd.cpp
ttd.cpp: In function 'int main()':
ttd.cpp:11:2: error: 'to_string' is not a member of 'std'

আমার প্রোগ্রাম যা এই ত্রুটি দেয়:

#include <string>

int main()
{
    std::to_string(0);
    return 0;
}

তবে, আমি জানি এটি হতে পারে না কারণ এমএসডিএন গ্রন্থাগারটি পরিষ্কারভাবে বলেছে যে এটি বিদ্যমান এবং স্ট্যাক ওভারফ্লো (জি ++ সংস্করণের জন্য 4.5.৪) সম্পর্কিত একটি পূর্ববর্তী প্রশ্ন বলছে যে -std=c++0xপতাকাটি দিয়ে এটি চালু করা যেতে পারে । আমি কি ভুল করছি?


5
আমার জিসিসি ৪.৪.৫ নিয়ে কাজ করে (অর্থাত্ একটি "দ্ব্যর্থহীন ওভারলোড" ত্রুটি দেয়); আপনার libstdc++বয়স কি পুরানো?
ফ্রেড ফু

3
এটি আইডিয়নে কাজ করে , যা জিসিসি 4.5.1 ব্যবহার করে।
কেরেক এসবি

5
এটি g ++ 4.6.3 এর সাথে আমার জন্য কাজ করে। আপনার ত্রুটিটি ১১ টি রেখাকে বোঝায় আপনি বলেছেন যে আপনার প্রোগ্রামটি আপনার কোডটিকে "মূলত" হ্রাস করা হয়েছে ", তবে আপনি যে কোড পোস্ট করেছেন তাও ত্রুটি দেয়?
ভন ক্যাটো

@ ভোজনগেটো - হ্যাঁ এটি হ'ল প্রোগ্রাম। এটি পরিষ্কার করার জন্য আমার এটি সম্পাদনা করা উচিত। এছাড়াও, আমি সেখানে কি বিপথগামী কি করছি?
অনুরাগ কালিয়া

2
এটি আমার পক্ষে কার্যকর হয় না, যদিও আমি জিসিসি 5.3.1 ব্যবহার করছি। তবে এটি কী ঠিক করে তা কেবল পরবর্তী সি ++ স্ট্যান্ডার্ড ব্যবহার করে - অর্থাত্ পতাকাটি -std=c++11বা তার থেকেও উচ্চতর সংকলন করে ।
আর্তুরো ডন জুয়ান

উত্তর:


212

এটি MinGW এর অধীনে একটি পরিচিত বাগ। প্রাসঙ্গিক বাগজিলা । মন্তব্য বিভাগে আপনি একটি প্যাচ এটি MinGW এর সাথে কাজ করার জন্য পেতে পারেন ।

এই ইস্যুটি মিনিজিডাব্লু -ডাব্লু .৪ প্রকল্পের মিনিসডাব্লু -ডাব্লু than৪ প্রকল্পের সরবরাহিত জিসিসি ৪.৮.০ এর চেয়ে বেশি ডিগ্রোতে স্থির করা হয়েছে । নাম সত্ত্বেও, প্রকল্পটি 32-বিটের পাশাপাশি 64-বিটের জন্য সরঞ্জামচেনগুলি সরবরাহ করে। Nuwen MinGW ডিস্ট্রো এই সমস্যা solves।


2
এখানে আরও আলোচনা: স্ট্যাকওভারফ্লো
বেন

11
আমি MinGW-w64 সংস্করণ 4.8.1 ব্যবহার করছি এবং এটি কাজ করছে না। আমি প্রশ্নটি থেকে সঠিক প্রোগ্রামটি অনুলিপি করেছি। আমি এখনও পাই 'টু স্ট্রিং' 'স্টাডি' ত্রুটির সদস্য নয়। আমি এটিকে সংকলিত করেছি: g ++ -std = c ++ 0x -o tostring_test.exe tostring_test.cpp
zam664

5
@ zam664 আমি কেন ব্যাখ্যা পারবেন না, কিন্তু আমি পেয়েছিলাম std::to_stringMinGW 4.8.1 (বিশেষত ইনস্টল করে কাজ x32-4.8.1-posix-dwarf-rev5) মাধ্যমে MinGW-তৈরী করে । এর বিপরীতে, to_stringকরেনি না সঙ্গে MinGW 4.8.1 হয় "mingw-get" ইনস্টলার বা TDM-জিসিসি প্যাকেজ মাধ্যমে ইনস্টল হবে।
সেররান

5
প্যাচ আমার জন্য যথেষ্ট ছিল না, আমি ছিল #define _GLIBCXX_USE_C99 1মধ্যে C:\MinGW\lib\gcc\mingw32\4.8.1\include\c++\mingw32\bits\c++config.hহিসাবে বর্ণনা এখানে
Zook

3
@ কেরান "মিনজিডব্লিউ-বিল্ডস" মিনজিডাব্লু-ডাব্লু 64৪, মিনজিডাব্লুয়ের একটি আলাদা প্রকল্প build মিনজিডাব্লু-ডাব্লু .64 টি বন্ধ হওয়ার এক কারণ ছিল যাতে তারা আসলে এই থ্রেডটির মতো বাগগুলি ঠিক করতে পারে।
এমএম

116
#include <string>
#include <sstream>

namespace patch
{
    template < typename T > std::string to_string( const T& n )
    {
        std::ostringstream stm ;
        stm << n ;
        return stm.str() ;
    }
}

#include <iostream>

int main()
{
    std::cout << patch::to_string(1234) << '\n' << patch::to_string(1234.56) << '\n' ;
}

অন্তর্ভুক্ত করতে ভুলবেন না #include <sstream>


স্টোডকেও অন্তর্ভুক্ত করার কোনও উপায় আছে?
জ্যাকি

আমি আপনার ফাংশনটি অন্য কোনও উত্স ফাইল থেকে কল করি: প্যাচ :: টু স্ট্রিং (ত্রুটি কোড) (যেখানে ত্রুটি কোডটি ইনট থাকে) এবং সংকলক আমাকে সেই লাইনে একটি ত্রুটি দেয়। ত্রুটিটি হ'ল: স্ট্যান্ড প্যাচ :: স্ট্রিং প্যাচ :: to_string <int> (int &) 'এর অপরিবর্তিত রেফারেন্স তবে যাইহোক আমি যখনই আপনার কোডটি একই উত্স ফাইল সংকলনে অন্তর্ভুক্ত করি তবে সে অভিযোগ করবে না। আমি কী ভুল হয়েছে তা জানার চেষ্টা করছি।
নিকোস

1
অনুগ্রহ করে নোট করুন যে এটি পিছনে শূন্য সম্পর্কিত কোনও সঠিক সমাধান নয়। আসলটি std::to_string(0.75)সাধারণত ফিরে আসবে "0.750000"(ডিফল্ট স্প্রিন্ট% d ফর্ম্যাট) যখন এটি ফিরে আসবে "0.75"। এখানে কারণে দেখুন: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

47

প্রস্তাবিত হিসাবে এটি আপনার সংকলক সংস্করণে সমস্যা হতে পারে।

একটি রূপান্তর করতে নিচের কোডটি ব্যবহার করার চেষ্টা করুন longথেকে std::string:

#include <sstream>
#include <string>
#include <iostream>

int main() {
    std::ostringstream ss;
    long num = 123456;
    ss << num;
    std::cout << ss.str() << std::endl;
}

আমি এটি চালাতে পারি নি তবে আমার তাৎক্ষণিক দ্বিধা সমাধান করার জন্য আপনাকে ধন্যবাদ। এখন আমি কেবল এটি কীভাবে কাজ করে তা নির্ধারণ করতে হবে। :)
অনুরাগ কালিয়া

কেবল একটি নোট যে আপনি যদি চান তবে std::stringতার .str()পরিবর্তে আপনি ব্যবহার করতে চান ।
খ্রিস্টান মান

1
অনুগ্রহ করে নোট করুন যে এটি পিছনে শূন্য সম্পর্কিত কোনও সঠিক সমাধান নয়। আসলটি std::to_string(0.75)সাধারণত ফিরে আসবে "0.750000"(ডিফল্ট স্প্রিন্ট% d ফর্ম্যাট) যখন এটি ফিরে আসবে "0.75"। এখানে কারণে দেখুন: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

20

এই ফাংশনটি ব্যবহার করুন ...

    #include<sstream>
    template <typename T>
    std::string to_string(T value)
    {
      //create an output string stream
      std::ostringstream os ;

      //throw the value into the string stream
      os << value ;

      //convert the string stream into a string and return
      return os.str() ;
    }

    //you can also do this
    //std::string output;
    //os >> output;  //throw whats in the string stream into the string

2
কোডটি বুঝতে কত সহজ হতে পারে তা বিবেচনা না করে আপনার উত্তরগুলিতে কিছু ব্যাখ্যা (কমপক্ষে মন্তব্য করুন) যুক্ত করুন।
vefthym

4
এটির মতো কাজ করা ভাল, তবে আমি কেন
স্ট্যান্ড সলিউশন

"স্ট্যান্ডার্ড" উপায় (স্ট্যান্ড :: টু স্ট্রিং) প্রায়শই কাজ করে - যখন তা না করে। sstream হ'ল "স্ট্যান্ডার্ড" কাজ।
নিক ভেন্স 0

অনুগ্রহ করে নোট করুন যে এটি পিছনে শূন্য সম্পর্কিত কোনও সঠিক সমাধান নয়। আসলটি std::to_string(0.75)সাধারণত ফিরে আসবে "0.750000"(ডিফল্ট স্প্রিন্ট% d ফর্ম্যাট) যখন এটি ফিরে আসবে "0.75"। এখানে কারণে দেখুন: stackoverflow.com/a/13686914/785171
Krzysztof Bociurko

12

টু স্ট্রিং সাইগউইনের কাছে বর্তমান সমস্যা

পুরানো থ্রেডের নতুন-ইশ উত্তর এখানে। একজন নতুন এসেছিল কিন্তু দ্রুত তাড়িয়ে দেওয়া হয়েছিল, সাইগউইন: জি ++ 5.2: 'টু স্ট্রিং' 'স্ট্যান্ড' এর সদস্য নয়

খুব খারাপ, সম্ভবত আমরা একটি আপডেট উত্তর পেয়েছি। @ অ্যালেক্সের মতে, সাইগউইন g ++ 5.2 এখনও 3 নভেম্বর, 2015 পর্যন্ত কাজ করছে না।

১ January জানুয়ারী, ২০১৫, রেড হাটের সিগউইন রক্ষণাবেক্ষণকারী কর্নিনা ভিনচেন বলেছিলেন যে সমস্যাটি নতুনের একটি সংকট ছিল। এটি বেশিরভাগ দীর্ঘ ডাবল ফাংশন সমর্থন করে না এবং তাই C99 সচেতন নয়।

রেড হ্যাট হ'ল,

... এখনও এক পর্যায়ে "লম্বা ডাবল" কার্যকারিতাটি নিউলিবে পরিণত করার আশা করছি।

25 অক্টোবর, 2015 তে কোরিয়ান আরও বলেছে ,

এটি এখনও চমৎকার হবে যদি কিছুটা গণিত জ্ঞানের অধিকারী লম্বা ডাবল ফাংশনগুলিকে নিউলিবে অবদান রাখে।

সুতরাং সেখানে আমাদের এটি আছে। হতে পারে আমাদের মধ্যে জ্ঞান, এবং সময় রয়েছে এমন একজন অবদান রাখতে এবং নায়ক হতে পারেন।

নিউলিব এখানে আছে


কেবলমাত্র এই বছর
গিটে

8

ডিফল্ট সি ++ স্ট্যান্ডার্ড পরিবর্তন করুন

থেকে (কম্পাইল FILE ব্যর্থ হয়েছে) ত্রুটি: 'to_string' 'এসটিডি' এর সদস্য নন

-std = C ++ 98

করার (কম্পাইল ফাইল সফল)

-std = c ++ 11 বা -std = c ++ 14

সাইগউইন জি ++ (জিসিসি) 5.4.0 এ পরীক্ষিত



2

আসল বিষয়টি হ'ল libstdc ++ আসলে std::to_string4.8.0 থেকে * -w64-mingw32 টার্গেটগুলিতে সমর্থিত । তবে এটিতে MinGW.org, সাইগউইন এবং ভেরিয়েন্টগুলির জন্য সমর্থন অন্তর্ভুক্ত নয় (যেমন এমএসওয়াইএস 2 থেকে * -pc-msys)। Https://cygwin.com/ml/cygwin/2015-01/msg00245.html এও দেখুন ।

আমি মিনিজিডব্লিউ-ডাব্লু .64 এর জন্য বাগ সমাধানের আগে একটি বাস্তবায়ন কার্যকর করেছি । অন্যান্য উত্তরে কোডের চেয়ে আলাদা হওয়া, এটি libstdc ++ (যতটা সম্ভব) নকল। এর জন্য স্ট্রিং স্ট্রিম নির্মাণের প্রয়োজন হয় না তবে libstdc ++ এক্সটেনশনের উপর নির্ভর করে। এমনকি এখন আমি উইন্ডোজটিতে মিংডাব্লু-ডাব্লু 64 লক্ষ্যগুলি ব্যবহার করছি, এটি এখনও একাধিক অন্যান্য লক্ষ্যগুলির জন্য ভাল কাজ করে (যতক্ষণ long doubleনা ফাংশনগুলি ব্যবহৃত হচ্ছে না)।


2

অ্যান্ড্রয়েডে কেন এমন হয় তা ভাবছেন এমন কারও জন্য কারণ আপনি কোনও ভুল সি ++ স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার করছেন because থেকে আপনার build.gradle মধ্যে C ++ লাইব্রেরি পরিবর্তন করার চেষ্টা করুন gnustl_staticথেকে c++_staticএবং C ++ স্ট্যান্ডার্ডের আপনার CMakeLists.txt থেকে -std=gnu++11থেকে-std=c++11


1

যদি আমরা নীচের মতো টেম্পলেট-লাইট-সলিউশন (উপরে প্রদর্শিত হিসাবে) ব্যবহার করি:

namespace std {
    template<typename T>
    std::string to_string(const T &n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

দুর্ভাগ্যক্রমে, আমাদের কিছু ক্ষেত্রে সমস্যা হবে। উদাহরণস্বরূপ, জন্য স্ট্যাটিক কনস্ট সদস্যদের জন্য:

hpp

class A
{
public:

    static const std::size_t x = 10;

    A();
};

CPP

A::A()
{
    std::cout << std::to_string(x);
}

এবং লিঙ্কিং:

CMakeFiles/untitled2.dir/a.cpp.o:a.cpp:(.rdata$.refptr._ZN1A1xE[.refptr._ZN1A1xE]+0x0): undefined reference to `A::x'
collect2: error: ld returned 1 exit status

সমস্যাটি সমাধানের একটি উপায় এখানে ( আকার_ t টাইপ করুন ):

namespace std {
    std::string to_string(size_t n) {
        std::ostringstream s;
        s << n;
        return s.str();
    }
}

আছে HTH।


0

কোডব্লকগুলিতে সেটিং -> সংকলক সেটিং -> সংকলক পতাকা -> নির্বাচন করুন স্ট্যান্ডার্ড সি ++ 11 সম্পন্ন করুন। আমার একই সমস্যা ছিল ... এখন এটি কাজ করছে!


-4

এটি আমার সাথেও ঘটেছিল, আমি আমার সংকলকটি আপডেট করার চিন্তা না করে কেবল একটি দ্রুত ফাংশন লিখেছিলাম।

string to_string(int number){
    string number_string = "";
    char ones_char;
    int ones = 0;
    while(true){
        ones = number % 10;
        switch(ones){
            case 0: ones_char = '0'; break;
            case 1: ones_char = '1'; break;
            case 2: ones_char = '2'; break;
            case 3: ones_char = '3'; break;
            case 4: ones_char = '4'; break;
            case 5: ones_char = '5'; break;
            case 6: ones_char = '6'; break;
            case 7: ones_char = '7'; break;
            case 8: ones_char = '8'; break;
            case 9: ones_char = '9'; break;
            default : ErrorHandling("Trouble converting number to string.");
        }
        number -= ones;
        number_string = ones_char + number_string;
        if(number == 0){
            break;
        }
        number = number/10;
    }
    return number_string;
}

29
এটি স্ট্যান্ড :: টু স্ট্রিংয়ের বিকল্প নয় এবং অবশ্যই প্রশ্নের উত্তর নয়।
ভেরাক্স

13
Std :: cout খুব কার্যকর করতে ভুলবেন না! মূল সমস্যাটি সনাক্ত করার চেয়ে প্রচুর অতিরিক্ত বাগ দিয়ে পুনরায় বাস্তবায়ন করা আরও ভাল!
জেএমসি

আপনি ওভার কমপ্লিক্স জিনিস তৈরি করছেন। ঠিকones_char = '0' + number % 10;
ফুক্লভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.