Просто наткнулся на странную проблему с шаблонами при переносе кода из Windows в Linux.
При условии, что образец компилируется с помощью MSVC и работает безупречно.
Пример кода:
#include <vector>
#include <iostream>
typedef std::vector<int> IntArray;
template <typename TArray>
void printArray(TArray a)
{
typedef TArray::iterator iter;
for (iter it = a.begin(); it != a.end(); ++it)
std::cout << *it << std::endl;
}
int main()
{
IntArray a;
a.push_back(1);
a.push_back(2);
a.push_back(3);
printArray(a);
return 0;
}
Но g++ жалуется, что
In function ‘void printArray(TArray):
bar.cpp:9: error: expected initializer before ‘iter
bar.cpp:10: error: ‘iter was not declared in this scope
bar.cpp:10: error: expected ‘; before ‘it
bar.cpp:10: error: ‘it was not declared in this scope
После часа прошения Google я понятия не имею, что происходит.
TArray
- зависимое имя, поэтому вам нужно использовать typename
следующим образом:
typedef typename TArray::iterator iter;
Это "должно" (знаменитые последние слова) также работают в MSVC.
Вот книга, которую я могу дать, объясняя это довольно тщательно:
typename
для некоторых независимых имен в шаблонах. Я не думаю, что для этого требуется диагностика.