2010-07-06 2 views
13
#include <iostream> 
#include <vector> 

int main() 
{ 
    class Int { 
     public: 
      Int(int _i) : i(i) {} 
     private: 
      int i; 
    }; 

    std::vector<Int> VI; 
} 

Я пытаюсь скомпилировать код выше и получил следующее сообщение об ошибке:почему создает локальный вектор типа сбой

foo.cc: In function 'int main()': 
foo.cc:13: error: 'main()::Int' uses local type 'main()::Int' 
foo.cc:13: error: trying to instantiate 'template<class _Alloc> class std::allocator' 
foo.cc:13: error: template argument 2 is invalid 
foo.cc:13: error: invalid type in declaration before ';' token 

Может кто-нибудь из вас сказать мне, почему я не могу сделать что-то вроде этого в C++? Заранее спасибо.

+0

Не тот же вопрос, но другой вопрос по той же проблеме: [с использованием локальных классов с алгоритмами stl] (http://stackoverflow.com/questions/742607/using-local-classes-with-stl-algorithms) –

ответ

11

Стандарт явно запрещает использование локальных классов для создания шаблонов в 14.3.1 [temp.arg.type]/2.

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

Это будет изменено в C++ 0x.

+1

спасибо, но почему? –

+2

Я не знаю о причинах решения в прошлом, но тот факт, что они изменили это ограничение в C++ 0x, по-видимому, подразумевает, что причины были не такими сильными или необходимыми для преодоления других языковых функций, которые были введены --think lambdas, которые фактически создают функциональные объекты на месте. –

+4

AFAIK старая проблема заключалась в создании шаблона. Компилятору необходимо решить, будет ли создаваться 'std :: vector ', когда он видит определение 'VI'. Это означает, что он должен иметь возможность точно идентифицировать _which_ определение 'Int' было использовано для создания экземпляра этого конкретного' std :: vector '. Вам действительно нужно уникальное искаженное имя для 'Int'. В приведенном выше примере вы можете иметь что-то вроде '__main__Int', но с вложенными неназванными областями это еще сложнее. – MSalters