«использование typedef-name… как класса» в предварительном объявлении
-
20-09-2019 - |
Вопрос
Здесь я работаю над некоторыми проектами на основе политик, и мне нужно определить множество типов шаблонов, чтобы сократить имена.
Теперь проблема в том, что когда мне нужно использовать указатель на один из этих типов, я пытаюсь просто объявить его вперед, но компилятор жалуется с сообщением test.cpp:8: error: using typedef-name ‘Test1’ after ‘class’
Это не имеет ничего общего с размерами, поскольку мне вообще не нужен объект, это просто указатель в файле «.h», куда я не хочу вносить весь шаблон.
Это г++:
//Works
class Test{};
class Test;
//Doesn't work
class Test{};
typedef Test Test1;
class Test1;
Есть какой-нибудь намек?
Решение
Правильно.Имя typedef не может использоваться в таком предварительном объявлении (технически это называется сложным спецификатором типа, и если такой спецификатор разрешается в имя typedef, программа является неправильной).
Я не понимаю, почему ты вообще нуждаться форвардная декларация в первую очередь.Потому что, если у вас уже есть определение типа, почему бы просто не использовать его?Это просто обозначение этого класса.
Редактировать:Судя по вашему комментарию, вам нужен назначенный заголовок форвардного объявления, во многом в том же духе. <iosfwd>
.Итак, если ваш шаблон называется Test_Template_Name_Long
, этот заголовок может выглядеть так
TestFwd.h
template<typename A, typename B>
class Test_Template_Name_Long;
typedef Test_Template_Name_Long<int, bool> Test1;
Тогда вы можете просто использовать этот заголовок вместо того, чтобы делать class Test1
, о котором компилятор понятия не имеет (и будет думать, что это новый класс, независимый от какого-либо шаблона и определения типа).
Другие советы
typedef Test Test1;
class Test1;
терпит неудачу, потому что typedef
Оператор служит объявлением типа Test1.
По сути, когда компилятор видит определение типа, он запоминает, что Test1 является синонимом Test.Потом, когда он увидит class Test1;
, он думает, что вы объявляете новый тип.Но он не может рассматривать это как объявление, поскольку имя Test1 уже используется в typedef.
Например, если вы хотите использовать предварительное объявление для Test1, вам необходимо поместить определение типа в каждый файл, используя это определение типа в качестве предварительного объявления.Поэтому вместо class Test1;
, вы бы сделали:
class Test;
typedef Test Test1;
Еще один случай, в котором возникает такая ситуация, заключается в следующем:
// File: network_fwd.hpp
#ifndef __NETWORK_FWD_HPP__
#define __NETWORK_FWD_HPP__
class Network;
typedef Network GarnetNetwork;
#endif // __NETWORK_FWD_HPP__
// File: network.hpp
#include "network_fwd.hpp"
class GarnetIntLink : public BasicLink
{
public:
friend class GarnetNetwork;
};
Мне пришлось это сделать, потому что на самом деле существовал класс GarnetNetwork, который я объединил с классом Network и хотел распространить его на весь остальной код, используя этот typedef.GCC по-прежнему выдает это сообщение: ошибка:используя имя typedef «GarnetNetwork» после «class».
Я очень ценю вашу помощь в этом деле.
Примечание:Кстати, я разместил этот вопрос здесь, потому что думал, что это примерно одно и то же, и чтобы не отвлекать сообщество.