сделать определение типа локальным для файла или подклассов - PullRequest
4 голосов
/ 14 июня 2011

Я объединяю 2 программы в одну, и в 2 разных файлах (у меня много файлов), у меня есть typedef с одинаковым именем, хотя и разных типов.

Эти типы будут использоваться в совершенно разных частях программы и никогда не будут общаться друг с другом или использоваться взаимозаменяемо.

Я могу, конечно, просто выполнить замену поиска в одном изфайлы, но мне было интересно, есть ли другое решение для этого.

Что-то вроде привязки typedef к определенному файлу.Или сделать определение типа локальным для класса и его подклассов.

Спасибо

Ответы [ 3 ]

8 голосов
/ 14 июня 2011

typedef s всегда"локально для файла". Так что не совсем понятно, что вы подразумеваете под «превращением его в файл». Typedef не представляет сущность со своей собственной связью, он просто создает псевдоним существующего типа. По этой причине проблема «сделать его локальным для файла» просто не существует. Каждый typedef виден только в той единице перевода (файле), в которой он объявлен. Итак, если вы можете быть уверены, что ваши идентичные имена typedef никогда не встречаются друг с другом в общем блоке перевода, ваша проблема формально решена.

Это не очень хорошая практика программирования, хотя одно и то же typedef-имя ссылается на разные типы в разных файлах, если только эти файлы не разделены естественным образом (например, принадлежат разным библиотекам или что-то в этом роде).

В противном случае вы всегда можете переименовать один из typedef или сделать его членом класса или членом пространства имен. Имейте в виду, однако, что в общем случае создание typedef члена класса потребует практически того же рода усилий, что и его переименование: ссылки на этот typedef должны будут обновляться в каждом месте, в котором они присутствуют. , Пространства имен могут быть немного проще, поскольку с пространствами имен вы можете использовать директиву using.

Но, опять же, если ваши typedef ссылаются только на два непересекающихся набора файлов, то проблема формально не существует. Если есть файлы, которые должны использовать оба typedef s, то усилия, которые вам придется потратить на исправление этих файлов, будут эквивалентны переименованию typedef s (независимо от выбранного вами метода).

4 голосов
/ 14 июня 2011

Вы можете инкапсулировать эти typedef в namespace:

namespace N1 {
  typedef int T;
}
namespace N2 {
  typedef int T;
}

И в любом файле, который вы хотите использовать первым typedef просто объявите:

using namespace N1;

то же самоевещь для другого тоже.

1 голос
/ 14 июня 2011

[...] Или сделать определение типа локальным для класса и его подклассов.

Ну, это просто:

struct A
{
 typedef int X;
}; 

struct B : A 
{ 
 X a; 
}; 

struct C
{
 typedef double X;
}; 

Определение типа вC ++.

...