Thanks for watching, hope you enjoyed the video! One change which I somehow didn't mention in the video was making the m_Handled boolean in the Event class public, and changing its name to Handled. You can see this exact change here in the GitHub commit: github.com/TheCherno/Hazel/commit/5bd809312a266c23d13d84dcd08a833a526aa264#diff-1efdcc4a89a5bfd4da4f5d73c3df72f8 Happy New Year!
@revvilo5 жыл бұрын
Much appreciated :)
@pramodbhandari91514 жыл бұрын
part 3 : 12:47
@ringkunmori6 жыл бұрын
Ogres are like Game engines, they have layers
@ap1evideogame446 жыл бұрын
What about cakes? Cakes have layers.
@alanramirezherrera74856 жыл бұрын
And onions, onions have layers
@Ayodehi6 жыл бұрын
Glad I wasn't the only one to think this... :)
@seditt51465 жыл бұрын
Parfait might be the greatest thing on the Whole Damn Planet!
@neemaadam3 жыл бұрын
When was the last time i watched that?
@KingdomBusiness216 жыл бұрын
Your channel and knowledge are invaluable. Understanding C++ in a modern, free and advanced way is a blessing. I genuinely hope and even pray that you receive financial support to do this as much as you want :D
@CalSeedy6 жыл бұрын
If the higher ups at EA would get their collective heads out of their a**es and realise the raw potential of coding outreach. Future employees, future contracts, more advertisement for them, it's win-win for them and TheCherno.
@madeso5 жыл бұрын
I wrote a layer system for my previous engines, in 90% a bool was less of a hassle to deal with given that you only have a maximum of like 5 layers. Layers also tend to get super complex if you have shared state/interaction between states.
@ComprarAlimento Жыл бұрын
there is a different way to set to /MDd or /MD that changes the properties accordingly. For /MDd, add : staticruntime "off" runtime "Debug" For /MD, add: staticruntime "off" runtime "Release"
@urzaschannel3335 Жыл бұрын
Actually it's enough just to remove 'staticruntime' statement - the Visual C will use project defaults which are /MD / MDd, although 'runtime' statements still may be required (Premake determines which version to use based on 'symbols' and 'optimization' statements)
@esben1816 жыл бұрын
I like your new style of presenting code. It allows me to read the code, minimize KZbin and then try to implement it myself.
@alicia6963 жыл бұрын
Super helpful and inspiring tutorial and game engine series!
@emanuelkokovics2 жыл бұрын
In the Application.cpp we have e.Handled but where is Handled defined?
@m96fa409 ай бұрын
I think it is a public variable, but I'm not so sure how did he implement it. However, you can make an inline bool Handled() const { return m_Handled; } function where m_Handled is your protected bool variable;
@ness39632 жыл бұрын
How would the layers communicate with one another? Say I have a slider in my GUI layer that modifies the FOV of my camera in my Game layer. Whats the best way to facilitate that kind of communication?
@wggesucht5336 жыл бұрын
I could really need a video on move Constructor / assignmment and copy elision!
@placid076 жыл бұрын
Love this series. Keep up the great work!
@aaronsiegel83676 жыл бұрын
FYI the m_LayerInsert iterator in the LayerStack class is invalidated when you emplace_back.
@nextwave51646 жыл бұрын
I had to do this. m_layerInsert = m_Layers.emplace(m_layerInsert,layer); m_layerInsert++;
@sevenbit4 жыл бұрын
yea the whole system is flawed - you can't do anything to the layer stack from update/event either. everything breaks if you add/remove a layer from an event or on update :)
@ChlorieHCl5 жыл бұрын
I think you may have made a slight mistake. The push and pop actions on the vector could potentially invalidate the m_LayerInsert iterator, so instead of using an iterator, use an offset variable to prevent bad things from happening.
@jasperschellingerhout2 жыл бұрын
According to cpp reverence "[delete] Invalidates iterators and references at or after the point of the erase, including the end() iterator." So a simple reversal of the two operations should fix it
@ncky24314 жыл бұрын
Class Hazel::Event has no member Handled. Its called m_Handled. And even then its inaccessible. So how does it work when you do it?
@ncky24314 жыл бұрын
Fixed it. You have to rename the m_Handled from the Event System Video to Handled and it must be public. And in the Event dispatcher m_Event is a private attribute. Just weird how he renamed it and didnt mention it but here you go.
@Hello-vq4tn4 жыл бұрын
@@ncky2431 Yeah that confused me too. Had to go digging through the commit on GitHub
@dawid44504 жыл бұрын
lol guys don't type every letter with him, you won't learn this way, try to implement some things on your own
@acelyon52212 жыл бұрын
Ima try this cause rn I have this issue, and I don't understand much of c++ but I did try and figure why it wouldn't work, and saw it was either not a member so I had to make it one, or it was reading the wrong header. I would love if he mentioned a rename and how he changed it cause errors in c++ can be hard to figure out for beginners
@acelyon52212 жыл бұрын
It worked thank you, I understand now how it works. :)
@joelincz83142 жыл бұрын
After some debugging I found I missed my export on layer class. Thanks!!
@Destroyer199419955 жыл бұрын
Very nice explanation Cherno thank you!
@pritamrathi30874 жыл бұрын
Thanks for the knowledge you share, your channel is invaluable. Didn't get such content/learnings from any other link. In some of the video you had said you will make a video on complete graphics flow, is it already there or yet to come?
@aarondraws76993 жыл бұрын
my window that I create turns white and is perpetually loading anyone have any solutions I'm really struggling because there is no error for me to look into what might have gone wrong
@aarondraws76993 жыл бұрын
fixed it accidentally deleted the line m_Window -> OnUpdate(); in the application.cpp Run function I though the layer-> OnUpdate would do that but you need both.
@許熙康6 жыл бұрын
Don't know if i have misunderstood anything but doesn't the function PushLayer() leave m_LayerInsert unaffected, it remains m_Layers.begin(), therefore, the line "m_LayersInsert--" in PopLayers() causes error?
@huyvole97246 жыл бұрын
Wow You have a good Log to show info !
@andreagenor6 жыл бұрын
what do you think to convert this project to cmake and make it more flexible for all other platforms?
@esben1816 жыл бұрын
He is already using Premake which allows you to port to other IDEs and hence other platforms.
@ryanmeyers38635 жыл бұрын
Can someone help me understand the for loop in Application::OnEvent() that he's added. At the first line (*--it)->OnEvent(e) Wouldn't this decrement it first, thus skipping the top layer? Also, LayerStack::PushLayer() doesn't increment m_LayerInsert, so I don't understand how it's supposed to keep track of where the overlays begin.
@BlackHawk24995 жыл бұрын
The end iterator points to the past-the-end element in the sequence. Therefore, we actually want to decrement the iterator before dereferencing it. std::vector test = { 1, 2, 3, 4, 5 }; // first element auto it = test.begin(); std::cout
@BlackHawk24995 жыл бұрын
To expand on this, C++ also supports reverse iterators with rbegin() and rend(). The provided code could be changed to something like this if you feel that it's easier to follow: for (auto it = m_layerStack.rbegin(); it != m_layerStack.rend();) { (*it++)->OnEvent(e); if (e.Handled) break; } EDIT: If you want this implementation to work you will need to add the rbegin() and rend() definitions to LayerStack.h: std::vector::reverse_iterator rbegin() { return m_Layers.rbegin(); } std::vector::reverse_iterator rend() { return m_Layers.rend(); }
@ComprarAlimento Жыл бұрын
@@BlackHawk2499 isnt it the same as: for (auto it = m_LayerStack.end() - 1; it != m_LayerStack.begin();) { (*it)->OnEvent(e); if (e.Handled) break; }
@aarondraws76993 жыл бұрын
Could anyone kindly explain why all of his variable name begin with m_ ? what organizational purpose does that serve?
@yabot54963 жыл бұрын
Member variable i guess?
@cuddeford2 жыл бұрын
Yes to differentiate the variables from method parameters of the same name. Using just an underscore instead of m_ is also common
@zhulikkulik Жыл бұрын
It's short for member. Sometimes you get a situation where your function receives int x as a parameter and you need to assign it to int x in your object. This way names won't clash and you can just m_x=x instead of this.x=x.
@RaneMstSage4 ай бұрын
member variable i use m instead of m_ some just use _
@adamodimattia4 жыл бұрын
“It’s hard for me to ALLOCATE time...” :)
@catorials4444 жыл бұрын
it's a really common phrase actually
@WilliamWelsh6 жыл бұрын
thank u for the tutorials maxmoefoe
@Sebanisu3 жыл бұрын
This is similar to the Test classes code you created in the opengl series.
@ryanj.s93405 жыл бұрын
Kind of dipping my toes here but I’m doing so natively with the Windows API and DirectX... is this the same concept as “deciding which child window has focus” in terms of how the Windows API words things on MSDN
@yan-amar5 жыл бұрын
So what if you pop a Layer but then forget to delete it ? I'm not one of those who freaks in front of a naked pointer, but you talk about the ownership semantics of the LayerStack, however there is nothing enforcing those semantics, not even hinting it in the interface of the stack. I think this is just the case where unique_ptr would make sense (and first of all, let's be honest, unique_ptr has no overhead wathsoever). You return an rvalue reference to unique_ptr on pop() to indicate that you are releasing ownership, and you take it back on push with the same parameter. That said, for my part I would make the stack just manipulate raw pointers and not own the Layers.
@climatechangedoesntbargain91405 жыл бұрын
+1
@dekrain5 жыл бұрын
Actually you would return actual unique_ptr on pop, not a reference, since the unique_ptr would not be in the stack anymore.
@nokompromis22974 жыл бұрын
In this scenario, Cherno is talking about a layer as a persistent thing, that shouldn't really be moved or deleted every frame, or frequently, at all. Thus, you would probably contain a real instace of a layer somewhere before you enter an entry point, and start doing stuff. Layers will be big, that is why Cherno isstoring them references to them, not as copies. Like a graphics layer with whole bunch of instructions, or events layer, with other heavy things, or debug layer with lots of ImGui stuff. Thatswhy, most of the time, you shouldn't bother about it, then you really shouldn't move or delete layers frequently.
@haos45744 жыл бұрын
@@nokompromis2297 the problem with his code is when you pop a layer, m_Layers loses reference to that layer, and thus it won't be deleted when the stack gets destroyed. The code is problematic.
@theo-dr2dz Жыл бұрын
@@nokompromis2297 No. Layer is polymorphic and polymorphy works through pointer indirection, not through value semantics. Also, the actual layers (GameLayer, ImguiLayer etc) are of different types and probably different sizes. That doesn't work with vector, vector needs elements of uniform type and size. The intention of the code is (kind of) deductable from the code. The layers are identified on pointer value, so if the client ever wants to pop a layer, it needs to keep it's own pointer. So, in this case the client is the owner of the Layer object. If the client doesn't keep it's own pointer, the stack becomes owner. But that is not very clear at all. I think yan-amar's suggestion is a lot better: store unique_ptr instead of Layer*. Let the pop functions return the unique_ptr so it returns the ownership back to the client. This clearly expresses the intention, and you will never leak a Layer object. Of course unique_ptr can't be copied so you need an intermediary: auto temp = std::move(*itr); m_layers.erase(itr); m_layerinsertindex--; return temp;
@daftmat314 жыл бұрын
I've heard about game states too, as I may not understand all of this deeply yet, I have a doubt, are the layers you're talking about just like the so-called GameState design ? I think it is, but again, i'm not sure
@kallebalik4 жыл бұрын
I know this video is old, but I have a question. Why do we want the overlay to be absolute last and not pushed in front of the other overlays?
@supersquare4 жыл бұрын
He explains this at 3:00
@kallebalik4 жыл бұрын
@@supersquare It's actually the opposite the renderer will go front to back and the event will go back to front. That's why he's pushing in the back. I just made the process much more complicated in my head :)
@andrewgraham25463 жыл бұрын
So correct me if I'm missing something but what is the use of wrapping vector in a separate class? Std::vector already gives us interators like begin and end and also rbegin and rend... couldnt the layerstack be a vector maintained inside the application class?
@egunan3 жыл бұрын
3:50
@mukov3 жыл бұрын
I was about to comment the bug that the "m_LayerInsert" will be invalidated, but i saw that you changed it to "unsigned int m_LayerInsertIndex". Don't use "unsigned" except for bit operations, "int" arithmetic is potentially faster, because it is not required to wrap around, "size_t" is a known mistake. 10x for the videos!
@TheRVenson Жыл бұрын
I did some research about this statement because it made me curious. Wouldn't using the unsigned int for the index be safer to ensure that the value is never negative? I'm not sure if that's the reason.
@nextwave51646 жыл бұрын
I made my Camera class inherit from Layer so it can receive Events. Wondering if it's a good idea?.. works fine enough.
@jamesmnguyen6 жыл бұрын
I think it makes more sense to have a Camera in every Layer. But whatever works, you can always change it later.
@DerrickCanfield6 жыл бұрын
Is there a reason you are not using smart pointers in your engine? I understand in your other C++ fundamentals, but I imagine since this is an actual persisting project, you would want to use smart pointers.
@anthonybrigante90875 жыл бұрын
I don't know if he's answered this at a different point in the series, but my assumption is that it's not worth the performance cost. Smart Pointers essentially introduce a form of garbage collection into C++, and doing this comes at a huge performance cost. In smaller projects where performance isn't vital, then smart pointers are a great idea - but if you need speed and are willing to manage memory yourself, smart pointers should be avoided.
@ChlorieHCl5 жыл бұрын
@@anthonybrigante9087 It's shared_ptr which has a noticeable overhead over raw pointers. If you don't use custom deleters, unique_ptr in release builds should be as efficient (memory-wise and performance-wise) as manually new-ing and delete-ing. So I don't see the point of not using unique_ptr...
@climatechangedoesntbargain91405 жыл бұрын
@@anthonybrigante9087 smart_pointers are zero-cost...
@anthonybrigante90875 жыл бұрын
@@climatechangedoesntbargain9140 smart pointers are absolutely not zero cost. I have to look more carefully into unique_ptrs overhead, since it seems to be fairly negligible, but a shared_ptr has a noticible performance overhead in high performance applications.
@climatechangedoesntbargain91405 жыл бұрын
@@anthonybrigante9087its zero cost. Zero cost does not mean that the usage is for free, but that you would pay the same if you would do it manually and correct. Situations where you actually need shared_ptrs are rare anyways.
@blenderalien4 жыл бұрын
In Application.cpp line "if (e.Handled)" i get the error "Handled is not a member of Hazel::Event." Edit: create a Getter "bool & get_Handled() {return m_Handled;}" and in App.cpp: "if (e.get_Handled())"
@dustinclark56203 жыл бұрын
Hello, would layers be the same as a State? StateStack etc? The implementation seems similar. Thanks
@b0570nk45 жыл бұрын
shouldnt there be virtual destructor for LayerStack?
@Berzeger5 жыл бұрын
LayerStack isn't supposed to have subclasses.
@dimts27016 жыл бұрын
Merry->Christmas(); //happy new year!
@greenscreen5876 жыл бұрын
segmentation fault (core dumped)
@srdjan30576 жыл бұрын
@@greenscreen587 Damn i miss Linux!
@agfd56596 жыл бұрын
Exception thrown at 0x00000000: Access violation executing location 0x00000000.
@catorials4444 жыл бұрын
does that mean that class Merry also has method Crisler?
@tttopcattt4 жыл бұрын
Has anyone else who's following along had an issue with the e.Handled call?
@andrewgeary4154 жыл бұрын
if you add a getter to event.h you can just call that instead
@shadowleague24864 жыл бұрын
I believe it would have been more efficient to use a doubly-linked list for the layer stack, wouldn't it?
@jonohiggs4 жыл бұрын
That would be insert efficient but read / iteration inefficient. The layers are iterated every render call but layers are added super infrequently, so this is optimised for the iteration
@sc5shout6 жыл бұрын
Is there any sense to create layers on different threads (or use them in a threadpool)?
@brendan-from-mars6 жыл бұрын
TheCherno is such a great teacher for modern C++, project structure and organization, programming patterns and so on that it is such a waste of talent that he just releases one video per week. Nevertheless, he is one of my favorite KZbinrs
@MsJavaWolf6 жыл бұрын
I think he still works at EA. Probably the main reason why he doesn't have time to release more, but on the other hand his job is what made him a good programmer in the first place. Many people who make a lot of videos don't seem to have a lot of real world experience.
@MatkoFaka6 жыл бұрын
Raw pointers are not modern C++
@evolucaohunz6 жыл бұрын
The composite pattern of calling on update on each object within a layer should be handled by hazel, right? As I see now it’s an app responsibility to keep a list of objects within the layer and forward the framework callbacks to them, which I don’t see any benefit, as a “layer” is simply another object in the point of view of the e engine. Did I miss something?
@ahmadkakarr6 жыл бұрын
thanks
@stfoggy124 Жыл бұрын
how should you address layers if you shouldnt address them by name?
@N014t4ll Жыл бұрын
Probably by indexing?
@stfoggy124 Жыл бұрын
@@N014t4ll I would Memorize a number any time I'd wanna address a specific layer?
@N014t4ll Жыл бұрын
Well I'm not exactly a pro at this but i think you could create an instance of the Layer and then pass in the address of the layer. Then anything you do to that layer should affect the layer in the layerstack. But I don't really know if this would work
@DrBarnabus6 жыл бұрын
Shouldn't the sandbox app be using MTd and MT as it isn't a DLL or am I missing something there?
@MsJavaWolf6 жыл бұрын
Those options don't determine if your project will be a static lib or a DLL, they determine how the visual c++ libraries are linked into your project. MD and MDd mean that your app will load the visual c libs dynamically, it doesn't matter if your project is a dll, a lib, or an exe.
@DrBarnabus6 жыл бұрын
@@MsJavaWolf Thanks for the good answer!
@KennyTutorials5 жыл бұрын
You be in future create scene system? Or layers be considered as scenes? I think scene need to load some other world like a shop, or 3d menu, or other game map. And layers are needed to control the rendering itself. I ask because I like to use the scene system. And I use it in my engine. I also believe that the scene is also the base of the core.
@jibrilyahaya37316 жыл бұрын
Can you like give us a challenge after each video about the topic of the video
@GamerDude276 жыл бұрын
Second this, challenges personally help me learn, and then the next video could contain Cherno's solution
@mjthebest72942 жыл бұрын
ChiliTomatoNoodle's style. Check him out :)
@derpartypatrick5660 Жыл бұрын
Great series and up until this point everything made sense imo. But I don't see this implementation of the layerstack as useful. You have to push layers from outside, but if you want to remove a layer you need to give it a pointer to that layer, why? So do I have to store the layer pointer outside the layerstack the whole time? Also the pop logic doesnt make any sense. You could pop an overlay using the PopLayer function or am I wrong. This is so error prone. Not to mention the readability: You should have a function like PushBaseLayer and one like PushOverlayLayer or something. I guess this system has to be rewritten in the future. Nevertheless great series up to this point!
@duyquannhan94142 жыл бұрын
For anyone who get error during debug, running "GenerateProject.bat" may solve the problem. I builted the project successfully, but during debug, if I moved the mouse or did anything that returns a log, I would get Assertion failed error. Running the ".bat" file did it for me, hope this will be useful for someone else.
@Xeab4 жыл бұрын
Layers are like ogres, they have game engines
@agfd56596 жыл бұрын
You could make a video explaining what the std runtime library actually is.
@jamesmnguyen6 жыл бұрын
The CRT runtime library is a collection of functions that are part of the standard, ie. memset, memcpy, strlen, malloc, etc. Usually it is implemented to work on one platform, ie Windows, Linux, MacOS. That's my knowledge, so anyone can correct me.
@madPL12392 ай бұрын
Hi, Can layers be called game states? Game states understood as: state of the menu, interface, state of the actual game, state of the intro, etc.
@jehadkhaled9066 жыл бұрын
you are the best
@youngjin83002 жыл бұрын
The code in LayerStack class is erroneous.
@ycombinator7656 жыл бұрын
where have you learned these concepts ?, please add some references to that material too by the way thanks for this amazing stuff #LongLiveCherno
@pooria_garrett30206 жыл бұрын
He has worked for more than 4 years (hopefully recollecting correctly) on game engines, and works currently @ EA in frostbyte division
@ycombinator7656 жыл бұрын
thanks
@oj00245 жыл бұрын
Talks about debug name only for debug... Has a getName member function Xd
@bacontf26 жыл бұрын
I was really looking forward to this series, it's a shame that now I feel cheated out of my own time because you seem not to value the opinion of your regular KZbin subscribers. When you announced you would be switching to this odd format of showing code you've already written (a format more suited to written media than a video), many people including myself voiced their opinion that this change would be detrimental to the viewing experience. One of the reasons why I feel this way is that it takes too long to pause, write out what there is on screen without any explanation, then unpause for a quick overview that would be much more detailed if you wrote it live - not to mention any mistakes or changes of mind you have along the way - it's a much more natural flow and helps show the viewer what the thought process should be when writing some code. People have pointed out to me that I can view the github repo for the code, but even when it's updated on time with the video's release, it's the same issue of just copying down text with little to no insight. I don't think anyone would have a problem with you releasing 1-2 hour long videos instead of these if it meant you wrote and spoke at the same time. I understand that you obviously first and foremost would like to make money from these videos, as evidenced by your patreon plugs at the start and end of the video, but I feel that it has distanced you from the people who can't support you with money as you don't seem to be even reading these comments and taking things on board. As someone who has enjoyed your videos for quite a while now - especially the Sparky series, I hope you continue to enjoy making these videos as much as I used to enjoy watching them, but I can't stick around if the video quality is coming down to this. Cheerio.
@bacontf26 жыл бұрын
@@totoze1956 Interesting, I had a feeling the patrons weren't getting their money's worth. I mean, offering a video or some code a week early is only a one-time benefit for someone interested in getting the videos early. Once they've seen that early video they still have to wait a week until the next one, and then if they decide not to pledge further, they have to wait 2 weeks to see the next video! Not a model that favours the viewer/supporter.
@Smilezlol6 жыл бұрын
First, How in the hell can you say he only does it for the money? These videos probably give next to nothing in terms of ad revenue, which is why he plugs his Patreon and the beginning and end (which is way better than most, nothing in the middle or content locked behind it). Obviously he wants money for the time invested, just like anyone would for doing this kind of high skilled work, which is why he gives his fans an OPTION to pay monthly for just a little bit of bonuses. Do you honestly think his Patreons care if they get their money's worth? They just want to support a content creator that has probably helped them out a ton that they themselves never had to give back to. I myself have learned more from this man than probably a year or two in a university would of taught me, all without paying a single dime, so to say that he is only in it for the money is just plain false. Second, your reasoning for why this format is worse makes no sense, because you argue that him writing it live would display more of his thought process, but that isn't removed, it's simply put at the beginning of his videos now, or sometimes put in a separate planning episode, if the topic is larger. Also, the reason cherno most likely made this change (besides it being easier for him) is because too often you see people so focused on copying the code. Any person whose made programming project tutorials, especially gamedev related, know that most of the people watching just mindlessly copy down the code without ever really making the decisions themselves. How i see this series is: "Here is something you want in your engine, here is my reasoning for implementing this, here is my implementation". Honestly the mental gymnastics you kind of people have to do to think that he only does it for the money is mind boggling.
@bacontf26 жыл бұрын
My main quarrel is not to do with whether he does it for the money or not - that's a whole different can of worms but it's not exactly mental gymnastics, rather it's just my opinion given what I have seen. I don't deny that he is a very good teacher - probably one of the best on KZbin. My issue is with the format of this series. I can see where you're getting confused about my reasoning regarding my dislike for the format; I did not mean it lacked an overall focus and explanation for the feature being added, but instead that the basic should I/shouldn't I thought process for writing a certain line of code one way or another. That is how other coding channels manage it, and they are more intuitive than the format being used here. Don't just take my word for it, look back at the comments section of the video where this format was announced. I'm far from the only one complaining. I'd also argue that this format actually makes it easier for people to just mindlessly copy down code - just pause, copy down, play until you see more code, pause, copy down etc. And copying from github is the same with even less explanation. In contrast, the normal format of live coding provides a constant stream of information and generally leads to things being described in more detail. Yes it takes longer to make, but as evidenced by this format change, the more time put into it, the better quality of video.
@pikmin40006 жыл бұрын
I, for one, wouldn't want this video to be an hour long, I believe this video series is great as it is because it allows you see the bigger picture faster which is important when talking about architecture decisions.
@thijsjansen20526 жыл бұрын
@@bacontf2 i do actually kind off like this new format, but you have to look different to the teaching process. instead of just hearing what he has to say and writing down what he codes, you should try to watch the video once, make notes, and then try to write the implementation in your own way. You should be capable of writing what he shows here whit your knowledge from the c++ tutorial series
@mxcha6 жыл бұрын
You have 123,456 subs
@kingsheep18296 жыл бұрын
to the project but not the app I really don't know where did I go wrong (EDIT) LOL I FOUND THE PROBLEM
@lct1133 жыл бұрын
what was the problem?
@humm5356 жыл бұрын
Vi is better than Emacs!
@Light-wz6tq6 жыл бұрын
5th
@emanuelkokovics2 жыл бұрын
Does anyone have the errors: Error C2079 'ss' uses undefined class 'std::basic_stringstream' Sandbox Error C2297 '