Вектор указателей на структуру - PullRequest
5 голосов
/ 11 января 2012

Следующая программа выглядит довольно хорошо для меня.Но я не могу его скомпилировать.

#include    <iostream>
#include    <vector>
using namespace std;

int main()
{
    struct a
    {
        int i;
        int j;
    };


    std::vector<a*> vecA;

    a* pA = new a;

    pA->i = 4;
    pA->j = 9;

    vecA.push_back(pA);

    return 0;
}

Генерируется следующая ошибка.

struct_update.cc: In function ‘int main()’:
struct_update.cc:32:19: error: template argument for ‘template<class _Alloc> class std::allocator’ uses local type ‘main()::a*’
struct_update.cc:32:19: error:   trying to instantiate ‘template<class _Alloc> class std::allocator’
struct_update.cc:32:19: error: template argument 2 is invalid
struct_update.cc:32:25: error: invalid type in declaration before ‘;’ token
struct_update.cc:39:10: error: request for member ‘push_back’ in ‘vecA’, which is of non-class type ‘int’

Ответы [ 2 ]

12 голосов
/ 11 января 2012

Это больше не соответствует действительности в новом стандарте C ++ 11, но современные компиляторы еще не полностью его реализовали.

Локальный тип не может быть параметром шаблона. Переместите определение структуры выше main, и все будет работать.

Или обновите ваш компилятор до того, который поддерживает эту часть C ++ 11.

Вот ограничение из C ++ 03, раздел 14.3.1 ([temp.arg.type]), которое удалено в C ++ 11:

Локальный тип, тип без связи, безымянный тип или тип, составленный из любого из этих типов, не должны использоваться в качестве аргумента шаблона для шаблона параметра типа .

6 голосов
/ 11 января 2012

Переместите определение структуры из главной функции.

   struct a
    {
        int i;
        int j;
    };

int main()
{

    std::vector<a*> vecA;

    a* pA = new a;

    pA->i = 4;
    pA->j = 9;

    vecA.push_back(pA);

В C ++ 03 вы не можете сделать это

Локальный тип, тип без связи,безымянный тип или тип, составленный из любого из этих типов, не должен использоваться в качестве аргумента шаблона для параметра типа шаблона.

В C ++ 11 я думаю, что вы можете в соответствии со стандартом.Хотя мой компилятор Visual Studio 11 отказывается разрешить это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...