Czy możliwe jest użycie typedef na std container bez specjalizacji?
Kod taki jak ten działa:
typedef std::vector<int> intVector;
Ale dla tego kodu:
template <typename T>
typedef std::vector<T> DynamicArray<T>;
Pojawia się błąd:
deklaracja szablonu "typedef"
Można to zrobić w C ++?
Odpowiedzi:
10 dla odpowiedzi № 1Tak, w C ++ 11.
template <typename T>
using DynamicArray = std::vector<T>;
(Nie, że powinieneś używać tego dokładnego aliasu).
6 dla odpowiedzi nr 2
Jeśli twój kompilator obsługuje c ++ 11:
template <typename T>
using DynamicArray = std::vector<T>;
w przeciwnym razie (c ++ 98 lub starszym) możesz użyć struktury pomocy, takiej jak poniżej
template<typename T>
struct DynamicArray
{
typedef std::vector<T> type;
};
a następnie użyj go jako
DynamicArray<int>::type my_array;
Dziedziczenie z std :: vector jest możliwym rozwiązaniem, ale należy pamiętać, że kontenery STL nie mają wirtualnego destruktora. to znaczy.:
template <typename T>
struct DynamicArray: vector<T> { ... };
int main() {
vector<int>* p = new DynamicArray<int>();
delete p; // this is Undefined Behavior
return 0;
}
3 dla odpowiedzi nr 3
Ta składnia jest nieważna w C ++, nie ma takiej funkcji jak "szablon typedef".
template <typename T>
typedef std::vector<T> DynamicArray<T>;
Jednak C ++ 11 wprowadza składnię aliasu szablonu, która wygląda prawie tak:
template <typename T>
using DynamicArray = std::vector<T>;
W C ++ 03 można użyć metafunkcji szablonu, takiej jak:
template<class T>
struct DynamicArray
{
typedef std::vector<T> type;
};
2 dla odpowiedzi № 4
Wspólnym rozwiązaniem (jeśli nie korzystasz z C ++ 11) jest wykonanie tego:
template<class T>
struct DynamicArray
{
typedef std::vector<T> Type;
};
I używaj go jako DynamicArray<Something>::Type
.