Skip to content
Trang chủ » Understanding The Undefined Template Type Error With Std::Shared_Ptr

Understanding The Undefined Template Type Error With Std::Shared_Ptr

SMART POINTERS in C++ (std::unique_ptr, std::shared_ptr, std::weak_ptr)

‘Shared_Ptr’ In Namespace ‘Std’ Does Not Name A Template Type

Introduction to ‘shared_ptr’ in namespace ‘std’

In C++, the ‘shared_ptr’ class is a smart pointer that provides shared ownership of an object. It is part of the C++ Standard Library and is located in the ‘std’ namespace. The ‘shared_ptr’ class allows multiple pointers to refer to the same object, ensuring automatic deallocation of the object when the last ‘shared_ptr’ pointing to it goes out of scope.

Understanding namespaces in C++

Namespaces in C++ are used to group related classes, functions, and variables together, avoiding naming conflicts and providing a modular approach to organizing code. A namespace is a declarative region that allows the definition of identifiers, such as classes and functions, to be uniquely identified. The ‘std’ namespace is the standard namespace in C++, which includes the standard library components.

The purpose and usage of ‘std’ namespace

The ‘std’ namespace is the standard namespace that contains the majority of the classes, functions, and templates in the C++ Standard Library. It is used to organize the standard library components and prevent naming conflicts with user-defined identifiers. By placing standard library components inside the ‘std’ namespace, the programmer can utilize them by prefixing the component’s name with ‘std::’.

Overview of the ‘shared_ptr’ template class

The ‘shared_ptr’ class is a template class that provides shared ownership of an object through a reference count mechanism. It allows multiple ‘shared_ptr’ instances to share ownership of an object, with the object being destroyed and deallocated when the last ‘shared_ptr’ pointing to it goes out of scope. This ensures that the object’s lifetime is extended as long as it is being used by any ‘shared_ptr’ instance.

Common errors encountered with ‘shared_ptr’

One of the common errors encountered with ‘shared_ptr’ is the error message “‘shared_ptr’ in namespace ‘std’ does not name a template type”. This error message indicates that the compiler is unable to recognize ‘shared_ptr’ as a template type within the ‘std’ namespace. This error can occur due to various reasons, including incorrect usage or missing header file inclusion.

Error message: “‘shared_ptr’ in namespace ‘std’ does not name a template type”

“‘shared_ptr’ in namespace ‘std’ does not name a template type” is an error message that indicates the compiler’s inability to recognize ‘shared_ptr’ as a template type within the ‘std’ namespace. This error prevents the proper usage of ‘shared_ptr’ and can cause compilation failures.

Possible causes of the error message

1. Missing header file inclusion: The error can occur if the required header file, , which defines the ‘shared_ptr’ template class, is not included in the code.
2. Incorrect usage: The error can occur if ‘shared_ptr’ is used without specifying the complete name, including the ‘std’ namespace prefix.

Troubleshooting the error message

To troubleshoot the “‘shared_ptr’ in namespace ‘std’ does not name a template type” error, follow these steps:

1. Check the presence of the header: Ensure that the code includes the header, which is required for using ‘shared_ptr’.
2. Verify the usage of ‘shared_ptr’: Make sure that ‘shared_ptr’ is used with the complete name ‘std::shared_ptr’, including the ‘std’ namespace prefix.

Best practices for using ‘shared_ptr’ in namespace ‘std’

1. Always include the header: To use ‘shared_ptr’, ensure that the header is included in the code.
2. Use the ‘std’ namespace prefix: When using ‘shared_ptr’, explicitly specify the ‘std’ namespace to avoid naming conflicts and help the compiler recognize ‘shared_ptr’ as a template type.
3. Prefer ‘make_shared’ over direct construction: Use ‘std::make_shared’ to create ‘shared_ptr’ instances instead of direct construction, as it provides better performance and reduces the risk of memory leaks.

FAQs

Q: What is an example code for using ‘shared_ptr’ in C++?
A: Here is an example code snippet that demonstrates the usage of ‘shared_ptr’ in C++:

“`
#include
#include

int main() {
std::shared_ptr numberPtr = std::make_shared(42);
std::cout << "Value: " << *numberPtr << std::endl; return 0; } ``` Q: Where can I find more information about 'shared_ptr' in C++? A: The website 'geeksforgeeks.org' provides detailed documentation and examples on 'shared_ptr' in C++. Q: How can I lock a 'shared_ptr' to prevent simultaneous access? A: To lock a 'shared_ptr' and prevent simultaneous access, you can use the 'shared_ptr::lock()’ function. It returns a ‘std::weak_ptr‘ that can be used to safely access the object while ensuring that it is still valid.

Q: Can I use ‘shared_ptr’ with different template arguments, such as ‘shared_ptr‘?
A: Yes, ‘shared_ptr’ can be used with different template arguments, including ‘void’. ‘shared_ptr‘ allows you to have a shared pointer that points to an object of any type. However, be cautious when using ‘shared_ptr‘ as it can lead to type-unsafe code.

Q: Is ‘boost::shared_ptr’ similar to ‘std::shared_ptr’?
A: Yes, ‘boost::shared_ptr’ is similar to ‘std::shared_ptr’ and provides shared ownership of objects. ‘boost::shared_ptr’ was the precursor to ‘std::shared_ptr’ and is part of the Boost C++ Libraries. However, ‘std::shared_ptr’ is now the preferred choice in modern C++ programming.

Q: How is the ‘shared_ptr’ implemented?
A: ‘shared_ptr’ uses a reference count mechanism internally to keep track of the number of ‘shared_ptr’ instances pointing to an object. When the reference count reaches zero, the object is automatically deallocated. The implementation also ensures thread safety through atomic operations.

Q: What is the difference between ‘shared_ptr’ and ‘unique_ptr’?
A: ‘shared_ptr’ allows multiple pointers to share ownership of an object, tracking the number of references and deallocating the object when the last ‘shared_ptr’ goes out of scope. On the other hand, ‘unique_ptr’ provides exclusive ownership of an object and deallocates it automatically when the ‘unique_ptr’ goes out of scope.

In conclusion, ‘shared_ptr’ in namespace ‘std’ is a powerful tool for managing object ownership and preventing memory leaks in C++. Understanding namespaces, proper usage, and troubleshooting common errors are essential for utilizing ‘shared_ptr’ effectively. By following best practices and using the ‘std’ namespace prefix, programmers can write robust and memory-safe code.

Smart Pointers In C++ (Std::Unique_Ptr, Std::Shared_Ptr, Std::Weak_Ptr)

What Is The Difference Between Std :: Shared_Ptr And Weak_Ptr?

What is the Difference between STD::shared_ptr and Weak_ptr?

When it comes to managing memory in C++, smart pointers have become an essential tool. They provide automatic memory management and help avoid memory leaks. Two prominent smart pointers in the C++ Standard Library, STD::shared_ptr and weak_ptr, serve similar purposes but differ in their behavior. In this article, we will delve into the differences between STD::shared_ptr and weak_ptr, exploring their features, use cases, and how they contribute to memory management in C++.

Understanding STD::shared_ptr

STD::shared_ptr is a smart pointer that allows multiple pointers to refer to the same object. It keeps count of the number of shared_ptrs pointing to an object. The underlying object is deleted when the last shared_ptr pointing to it goes out of scope or gets explicitly reset. This feature is commonly referred to as “reference counting.”

One of the key advantages of STD::shared_ptr is that it provides shared ownership. This means that multiple parts of a program can access and use an object, ensuring that it continues to exist until the last shared_ptr releases it. This is especially useful in scenarios where multiple objects or components require access to a single shared resource.

However, STD::shared_ptr is not without its limitations. The primary downside is that it can potentially lead to circular dependencies, also known as memory leaks. If two or more objects have shared_ptrs pointing to each other, their reference count would never reach zero, preventing deallocation. To mitigate this issue, weak_ptr comes into play.

Understanding weak_ptr

A weak_ptr is another smart pointer that is designed to solve the issue of circular dependencies. It provides a non-owning reference to an object that is managed by STD::shared_ptr. Unlike shared_ptr, it does not contribute to the reference count and does not prolong the lifetime of the object. Instead, weak_ptr observes the lifetime of the object and can be used to check if the associated object still exists.

Weak_ptrs are primarily used when you need to observe or access an object that may or may not be present. It allows you to safely access the object as long as it exists, without the risk of introducing circular dependencies. If the associated shared_ptr is destroyed or reset, the weak_ptr can detect it and update its internal state to reflect that the object is no longer accessible.

When should you use shared_ptr and weak_ptr?

Choosing between STD::shared_ptr and weak_ptr depends on the specific use case at hand. Shared_ptr should be used when you need to enable shared ownership and ensure the object stays alive until the last shared_ptr is released. This is particularly useful when dealing with shared resources or objects that require multiple parts of the program to access and manage them.

On the other hand, weak_ptr is ideal when you want to observe an object’s existence without affecting its lifetime. It is typically used to break circular dependencies, where shared ownership is not required. Weak_ptr allows you to safely check if the associated object is still valid, regardless of whether it has been deallocated or not.

Additionally, weak_ptr is frequently used in scenarios where you need to implement cache mechanisms or event-based systems, where objects may be deleted or removed dynamically.

Frequently Asked Questions

Q: Can weak_ptr be converted to shared_ptr?
A: Yes, weak_ptr can be converted to shared_ptr using the lock() member function. It returns a shared_ptr that shares ownership with the original shared_ptr associated with the object, guaranteeing the object’s existence during the lifetime of the new shared_ptr.

Q: Can shared_ptr be converted to weak_ptr?
A: No, shared_ptr cannot be directly converted to weak_ptr. This is by design to prevent accidental prolongation of an object’s lifetime.

Q: How does weak_ptr handle expired objects?
A: When a weak_ptr’s associated shared_ptr is destroyed or reset, the weak_ptr becomes empty (expired). Any attempts to dereference an expired weak_ptr will result in undefined behavior. Hence, it is crucial to check the validity of a weak_ptr using the expired() member function before attempting to use it.

Q: Do weak_ptr and shared_ptr both incur the same performance overhead?
A: weak_ptr incurs less overhead compared to shared_ptr as it does not contribute to reference counting. However, accessing the object through a weak_ptr requires acquiring a shared_ptr through lock(), which introduces a minor additional cost.

Q: When should I use raw pointers instead of smart pointers?
A: Smart pointers like shared_ptr and weak_ptr provide automatic memory management and are usually preferred over raw pointers. However, there are certain scenarios, such as interacting with legacy code or certain performance-critical contexts, where raw pointers might be more suitable. When using raw pointers, make sure to adhere to appropriate memory allocation and deallocation practices to avoid memory leaks.

In conclusion, STD::shared_ptr and weak_ptr are both valuable tools for memory management in C++. While shared_ptr facilitates shared ownership, weak_ptr enables safe observation of an object’s existence without affecting its lifetime. Understanding the differences between these smart pointers and their appropriate use cases will help you write more robust and efficient C++ code.

When Should You Use Std :: Unique_Ptr Vs Std :: Shared_Ptr?

When Should You Use std::unique_ptr vs std::shared_ptr?

In C++, smart pointers have become an essential part of modern programming. They provide automatic memory management by eliminating the need for manual memory deallocation, thus reducing the risk of memory leaks. Two popular smart pointers available in the C++ Standard Library are std::unique_ptr and std::shared_ptr. But when should you use one over the other? Let’s explore the differences between std::unique_ptr and std::shared_ptr and understand their ideal use cases.

std::unique_ptr:
std::unique_ptr is a smart pointer that provides exclusive ownership of the managed object. It ensures that only one std::unique_ptr can point to an object at a given time. When the unique_ptr goes out of scope or is explicitly reset, it automatically deallocates the associated memory.

This exclusive ownership characteristic makes std::unique_ptr ideal for scenarios where you need to express sole ownership. It is particularly useful for managing resources like raw pointers or dynamically allocated variables that are not intended to be shared among multiple entities.

For example, consider a situation where you need to manage the memory allocated for an object that is passed to a function. Since the function takes ownership of the object, std::unique_ptr is the perfect choice. It guarantees that the memory will be properly deallocated, regardless of any exceptional situations that may occur within the function.

Another use case for std::unique_ptr is when implementing factory functions that return pointers to objects. By returning a std::unique_ptr, you clearly communicate the ownership semantics to the caller, preventing potential memory leaks.

std::shared_ptr:
On the other hand, std::shared_ptr is a smart pointer that enables shared ownership of an object. It maintains a control block that contains the reference count of the number of shared_ptr instances pointing to the object. When the reference count reaches zero, the object is automatically deallocated.

The shared ownership model makes std::shared_ptr suitable for scenarios where multiple entities need to access and manage the same object dynamically. It excels in situations where you want to ensure the object remains valid until all the entities are done with it, even if the entities go out of scope at different times.

Consider a cache system where multiple components need access to a shared resource. By using std::shared_ptr, you can guarantee that the resource will be kept alive as long as at least one entity requires it. Once all entities release their ownership, the associated memory will be deallocated automatically.

std::shared_ptr is also helpful when dealing with cyclic dependencies. If objects have circular references, it becomes challenging to determine the appropriate time to deallocate memory. By adopting std::shared_ptr, the reference counting mechanism can handle the deallocation, ensuring proper memory management.

FAQs:

Q: What happens if I use std::shared_ptr instead of std::unique_ptr when I only need one owner?
A: While using std::shared_ptr when you only need one owner is not necessarily incorrect, it carries the overhead of maintaining the reference count. std::unique_ptr, on the other hand, is more lightweight and performs better as it does not have to keep track of the reference count.

Q: Can I change the ownership from std::shared_ptr to std::unique_ptr?
A: No, it is not directly possible to change the ownership from std::shared_ptr to std::unique_ptr. This is because std::unique_ptr represents exclusive ownership, while std::shared_ptr represents shared ownership. However, you can release the ownership from a std::shared_ptr and then transfer it to a std::unique_ptr using the release() function.

Q: What if I need both shared and exclusive ownership of an object?
A: In scenarios where you need both shared and exclusive ownership, you can use std::shared_ptr in combination with std::weak_ptr. std::weak_ptr provides a non-owning reference to a shared object managed by std::shared_ptr. It allows you to check if the object still exists and, if it does, obtain a std::shared_ptr to the object.

Q: Are there any performance implications for using either std::unique_ptr or std::shared_ptr?
A: As mentioned earlier, std::unique_ptr is generally more lightweight and performs better than std::shared_ptr due to its exclusive ownership model. However, the performance difference is usually negligible unless you are dealing with a massive number of objects or tight memory constraints.

In conclusion, the choice between std::unique_ptr and std::shared_ptr depends on the ownership semantics required by your application. If you need exclusive ownership with deterministic destruction, opt for std::unique_ptr. If you require shared ownership and automatic deallocation when all references are released, choose std::shared_ptr. Understanding the differences and use cases of these smart pointers is crucial for writing efficient and robust C++ code.

Keywords searched by users: ‘shared_ptr’ in namespace ‘std’ does not name a template type shared_ptr c++ example code, shared_ptr, shared_ptr c++ – geeksforgeeks, shared_ptr lock, shared_ptr

Categories: Top 100 ‘Shared_Ptr’ In Namespace ‘Std’ Does Not Name A Template Type

See more here: nhanvietluanvan.com

Shared_Ptr C++ Example Code

Shared_ptr is a smart pointer in C++ that provides automatic memory management by keeping track of the number of references to a dynamically allocated object. It allows multiple shared_ptr objects to share ownership of the same resource, ensuring that the object is automatically destroyed when it is no longer needed. In this article, we will explore shared_ptr in C++ with example code, its benefits, and how to use it effectively.

The shared_ptr is part of the C++11 standard and is defined in the header. To use shared_ptr, you need to include this header file in your code. Let’s dive into an example to understand its usage better:

“`cpp
#include
#include

class MyClass {
public:
MyClass() { std::cout << "Constructor called!" << std::endl; } ~MyClass() { std::cout << "Destructor called!" << std::endl; } }; int main() { std::shared_ptr mySharedPtr(new MyClass());
// …
// Use the shared_ptr as needed
// …
return 0;
}
“`

In the above code, we create a class called MyClass that prints messages to the console in its constructor and destructor. Inside the main function, we create a shared_ptr object called mySharedPtr, which is initialized with a dynamically allocated instance of MyClass. This means that mySharedPtr now owns and manages the lifetime of this MyClass object.

One important thing to note is that you can assign a shared_ptr to another shared_ptr or reset it to nullptr. This will change the ownership of the dynamically allocated object accordingly:

“`cpp
#include
#include

class MyClass {
public:
MyClass() { std::cout << "Constructor called!" << std::endl; } ~MyClass() { std::cout << "Destructor called!" << std::endl; } }; int main() { std::shared_ptr mySharedPtr1(new MyClass());
std::shared_ptr mySharedPtr2 = mySharedPtr1; // Both shared_ptrs now own the object

mySharedPtr1.reset(); // Release the ownership from mySharedPtr1

mySharedPtr2.reset(); // Object is destroyed, as now mySharedPtr2 is the only owner

return 0;
}
“`

In the above code, we demonstrate how shared_ptrs can be assigned to each other and control the lifetime of the object. The constructor and destructor messages will be shown accordingly.

Frequently Asked Questions (FAQs):

Q1. What happens if I assign a raw pointer to a shared_ptr?
A1. Assigning a raw pointer to a shared_ptr results in shared ownership of the object, meaning the object’s lifetime is managed by the shared_ptr. However, you should avoid using raw pointers and prefer shared_ptr from the start to ensure better memory management.

Q2. Can I create a shared_ptr without initializing it with a dynamically allocated object?
A2. Yes, you can create an empty shared_ptr by simply assigning it to nullptr. It will not own any object until you assign it using the reset or assignment operator.

Q3. How does shared_ptr ensure proper deallocation of memory?
A3. shared_ptr uses reference counting internally to determine when an object should be deleted. It maintains a reference count and each shared_ptr owning the object increments this count. When the count reaches zero, meaning there are no shared_ptrs holding the object, the managed object is automatically deleted.

Q4. Can shared_ptr cause memory leaks?
A4. shared_ptr can help prevent memory leaks by automatically managing the lifetime of objects. However, cyclic references among shared_ptrs can cause memory leaks as the reference count will never reach zero. To avoid this, you can use weak_ptr in combination with shared_ptr to break cyclic dependencies.

Q5. Are there any performance overheads associated with shared_ptr?
A5. There is a small performance overhead associated with shared_ptr due to the reference counting mechanism. Each time a shared_ptr is copied, the reference count is incremented, and each time a shared_ptr is destroyed or reset, the reference count is decremented. However, the performance impact is generally negligible in most scenarios.

In conclusion, shared_ptr in C++ is a powerful smart pointer that enables shared ownership of dynamically allocated objects. It automatically manages the lifetime of the objects, preventing memory leaks. By using shared_ptr effectively, you can simplify memory management in your code and ensure proper deallocation of resources.

Shared_Ptr

Understanding shared_ptr in C++: A Comprehensive Guide

Introduction

In the world of C++, managing memory allocation and deallocation can be a challenging task, especially when dealing with dynamically allocated objects. Traditionally, programmers have relied on raw pointers to dynamically allocate and deallocate objects. While this approach can work, it can also lead to potential memory leaks or other memory-related bugs if not handled carefully. To address these concerns, C++11 introduced a powerful Smart Pointer called shared_ptr. This article dives into shared_ptr in depth, explaining its features, usage, and benefits.

What is shared_ptr?

shared_ptr is a smart pointer defined in the header that provides automatic memory management for dynamically allocated objects. Unlike raw pointers, shared_ptr keeps track of the number of shared references to an object, ensuring that the memory is automatically released once there are no references left. This makes handling dynamic memory allocation much safer and easier, eliminating memory leaks and the need for manual deallocation.

Using shared_ptr

To use shared_ptr, you first need to include the header in your program. Then, you can create a shared_ptr by calling the make_shared function, passing the desired object as an argument. For example, consider the following code snippet:

“`cpp
#include

int main() {
std::shared_ptr ptr = std::make_shared(42);
// … rest of the code
}
“`

In this example, we create a shared_ptr to an integer with an initial value of 42. The shared_ptr will automatically manage the memory for this integer, meaning that once the shared_ptr goes out of scope or is explicitly reset, the integer will be deallocated.

Sharing ownership

One of the most powerful features of shared_ptr is the ability to share ownership of dynamically allocated objects among multiple shared_ptrs. This is accomplished by creating multiple shared_ptrs from the same underlying object. Each shared_ptr keeps track of the number of references pointing to the object, ensuring that it is only deallocated when all shared_ptrs are no longer referencing it.

“`cpp
#include
#include

int main() {
std::shared_ptr ptr1 = std::make_shared(42);
std::shared_ptr ptr2 = ptr1; // Sharing ownership

std::cout << *ptr1 << std::endl; // Prints 42 std::cout << *ptr2 << std::endl; // Prints 42 // ... rest of the code } ``` In this example, both ptr1 and ptr2 share ownership of the same integer object. The value can be accessed through either shared_ptr, and modifying the object through one shared_ptr will be reflected in the other. The memory will only be deallocated when both shared_ptrs are either reset or go out of scope. Avoiding circular dependencies shared_ptr also provides a solution for avoiding circular dependencies, where two or more objects hold shared_ptrs to each other, resulting in a memory leak. To resolve this, C++11 introduced weak_ptr, a weaker smart pointer that creates non-owning references to an object. By using weak_ptr in combination with shared_ptr, we can break circular dependencies without keeping the objects alive indefinitely. ```cpp #include

class Node {
public:
std::shared_ptr next;
};

int main() {
std::shared_ptr node1 = std::make_shared();
std::shared_ptr node2 = std::make_shared();

node1->next = node2;
node2->next = node1;

// … rest of the code
}
“`

In this example, we have two Node objects, node1 and node2, which hold shared_ptrs to each other as members. By using shared_ptr, the objects would never be deallocated due to the circular dependency. However, by replacing the member shared_ptrs with weak_ptrs, we break the circular dependency and enable proper memory management.

Common FAQs about shared_ptr:

Q: Can shared_ptr be used with arrays?
A: Yes, shared_ptr can manage dynamically allocated arrays. Instead of using make_shared, you can use make_shared_array to create a shared_ptr for dynamically allocated arrays.

Q: Can shared_ptr be used in multithreaded programs?
A: Yes, shared_ptr is thread-safe for reading operations but requires synchronization for writing operations, as multiple threads might attempt to modify the reference count simultaneously.

Q: Can shared_ptr handle custom deallocation?
A: Yes, shared_ptr allows you to define a custom deleter function when creating the shared_ptr. This enables the use of shared_ptr with resources other than dynamic memory, such as file handles or network connections.

Q: Are there any performance implications when using shared_ptr?
A: shared_ptr has a small overhead due to the reference count being managed, but the performance impact is generally negligible. However, if performance is critical, using unique_ptr or raw pointers might be more appropriate.

Q: Can shared_ptr handle circular dependencies between objects of different types?
A: No, shared_ptr can only handle circular dependencies between objects of the same type. For circular dependencies between objects of different types, a more complex approach involving weak_ptr, enable_shared_from_this, or other design patterns may be necessary.

Conclusion

Shared_ptr is a powerful tool in C++ that simplifies memory management for dynamically allocated objects. By automatically tracking shared references and deallocating objects when they are no longer needed, shared_ptr eliminates memory leaks and the risk of manual deallocation errors. It promotes safer and more robust code, making it a valuable addition to every C++ programmer’s toolkit.

Images related to the topic ‘shared_ptr’ in namespace ‘std’ does not name a template type

SMART POINTERS in C++ (std::unique_ptr, std::shared_ptr, std::weak_ptr)
SMART POINTERS in C++ (std::unique_ptr, std::shared_ptr, std::weak_ptr)

Found 25 images related to ‘shared_ptr’ in namespace ‘std’ does not name a template type theme

Multithreading - C++ Mutex In Namespace Std Does Not Name A Type - Stack  Overflow
Multithreading – C++ Mutex In Namespace Std Does Not Name A Type – Stack Overflow
Auto_Ptr Vs Unique_Ptr Vs Shared_Ptr Vs Weak_Ptr In C++ - Geeksforgeeks
Auto_Ptr Vs Unique_Ptr Vs Shared_Ptr Vs Weak_Ptr In C++ – Geeksforgeeks
Auto_Ptr Vs Unique_Ptr Vs Shared_Ptr Vs Weak_Ptr In C++ - Geeksforgeeks
Auto_Ptr Vs Unique_Ptr Vs Shared_Ptr Vs Weak_Ptr In C++ – Geeksforgeeks
C++ - Should I Switch From Using Boost::Shared_Ptr To Std::Shared_Ptr? -  Stack Overflow
C++ – Should I Switch From Using Boost::Shared_Ptr To Std::Shared_Ptr? – Stack Overflow

Article link: ‘shared_ptr’ in namespace ‘std’ does not name a template type.

Learn more about the topic ‘shared_ptr’ in namespace ‘std’ does not name a template type.

See more: nhanvietluanvan.com/luat-hoc

Leave a Reply

Your email address will not be published. Required fields are marked *