Различия с использованием шаблонов в MSVC и g ++ [дубликаты]

0

Просто наткнулся на странную проблему с шаблонами при переносе кода из 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 я понятия не имею, что происходит.

  • 0
    @ Кейси, я думаю, что этот мой вопрос не дублирует твой, потому что это своего рода ответ на мой.
Теги:
visual-c++
g++

1 ответ

4
Лучший ответ

TArray - зависимое имя, поэтому вам нужно использовать typename следующим образом:

typedef typename TArray::iterator iter;

Это "должно" (знаменитые последние слова) также работают в MSVC.

Вот книга, которую я могу дать, объясняя это довольно тщательно:

Шаблоны C++: полное руководство

  • 0
    Если я не ошибаюсь, MSVC ++ даже принимает typename для некоторых независимых имен в шаблонах. Я не думаю, что для этого требуется диагностика.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню