Это мне очень помогло: http://www.farinspace.com/us-cities-and-state-sql-dump/
У него есть файл .zip с 3 .sql файлами, которые вы можете просто запустить в ssms.
Возможно, вам придется заменить некоторые странно закодированные одинарные кавычки на двойные.
Это проблема, называемая « двухэтапный поиск ». По сути, поскольку A
является параметром шаблона в определении foo ()
, компилятор не может знать при синтаксическом анализе шаблона в первый раз, является ли Foo :: AVec
является типом или даже существует (поскольку, например, может существовать специализация Foo
, которая вообще не содержит typedef). Он будет знать, что это такое, только во время создания экземпляра шаблона , что произойдет позже - а для этого этапа уже слишком поздно.
Правильный способ - использовать ключевое слово typename
для указания что это тип:
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
typename Foo<A>::AVec* Foo<A>::foo() {
return NULL;
}
Обычная проблема typename
:
template<class A>
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
Помните: как правило, все уточненные имена, зависящие от параметра шаблона, должны иметь перед собой typename
.
Я точно не знаю, но попробуйте поместить typedef вне класса.