«использование typedef-name… как класса» в предварительном объявлении

StackOverflow https://stackoverflow.com/questions/2263154

Вопрос

Здесь я работаю над некоторыми проектами на основе политик, и мне нужно определить множество типов шаблонов, чтобы сократить имена.
Теперь проблема в том, что когда мне нужно использовать указатель на один из этих типов, я пытаюсь просто объявить его вперед, но компилятор жалуется с сообщением 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».

Я очень ценю вашу помощь в этом деле.

Примечание:Кстати, я разместил этот вопрос здесь, потому что думал, что это примерно одно и то же, и чтобы не отвлекать сообщество.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top