2012-05-29 5 views
3

Я пытаюсь использовать структуры typedef внутри моей программы на C++. Я начал писать следующий код, пока не получил ошибку при попытке добавить метод к моему классу, который возвращает указатель на структуру шаблона typedef.C++ Класс Typedef Struct не называет тип

StructSource.h

template <typename T> 
class StructSource { 
public: 
    struct TestStruct{ 
     T value; 
    }; 
}; 

user.h

#include "StructSource.h" 

class User { 
    public: 
     typedef StructSource<int>::TestStruct IntStruct; 

     IntStruct *getIntStruct(); 

}; 

User.cpp

#include "User.h" 

IntStruct *User::getIntStruct() { 
    return 0; 
} 

Это дает следующее сообщение об ошибке при компиляции с GCC.

User.cpp:3:1: error: ‘IntStruct’ does not name a type

Я затрудняюсь объяснить, почему это так. Какую информацию типа мне не хватает?

+4

Быстрый ответ, пока я ищу дублированный вопрос: используйте 'User :: IntStruct'. – Xeo

+0

* Шляпы лба * Конечно. – Nexus

ответ

11

«Пользователь» также «пространство имен» (сфера, на самом деле, так как большинство комментаторов указывают - «пространство имен» был быстрый ответ) здесь, так что вы должны использовать

User::IntStruct *User::getIntStruct() { 
    return 0; 
} 
+1

Это не пространство имен, это * область *. И вы должны использовать его только потому, что возвращаемый тип не находится внутри области класса, а остальная часть декларации/определения. На самом деле даже в конце области видимости указан тип возвращаемого конца (C++ 11): 'auto User :: getIntStruct() -> IntStruct * {return 0; } '. – Xeo

+1

, конечно, поэтому я назвал это «пространство имен» в кавычках. «Scope» также создает путаницу со временем выполнения. –

5

Понадобится:

User::IntStruct *User::getIntStruct() { ... } 

IntStruct определяется внутри User сферы, но возвращаемое значение функции не входят в комплект. есть обсуждение этих вопросов, связанных с обзором here.

2

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

User::IntStruct *User::getIntStruct() { 

Это не такой же, как пространство имен, несмотря на то, что синтаксис является идентичным.

Смежные вопросы