Избегайте ошибок переопределения в классе шаблона - PullRequest
0 голосов
/ 18 октября 2018

Для целей ввода-вывода мне нужно связать с различными типами символьную строку.Для этого я создал шаблон класса names, который специализирован для каждого типа, который мне нужно назвать.Вот заголовочный файл:

template<typename T>
class names {};

template<>
class names<Index> {
public:
    static const std::string name;
};

template<>
class names<Integer> {
public:
    static const std::string name;
};

И соответствующий исходный файл:

const std::string names<Index>::name = "Index";

const std::string names<Integer>::name = "Integer";

Index и Integer определены через typedef:

typedef std::ptrdiff_t Index;

typedef int Integer;

Код компилируется и отлично работает на компьютерах macOS и Ubuntu, которые я использую.Однако на компьютере с Windows std::ptrdiff_t определяется как int.Затем я получаю следующую ошибку:

In file included from lib/mixt_MixtComp.h:22:0,
                 from dummy.cpp:5:
lib/LinAlg/names.h:28:7: error: redefinition of 'class mixt::names<int>'
 class names<Integer> {
       ^
lib/LinAlg/names.h:22:7: error: previous definition of 'class mixt::names<int>'
 class names<Index> {
       ^

Есть ли способ избежать этой ошибки?Я могу использовать C ++ 11.

1 Ответ

0 голосов
/ 18 октября 2018

У вас есть два варианта:

  1. В Windows выберите только одну специализацию и не определяйте другую.(Ew.)
  2. Здесь вам действительно нужен strong typedef , а не просто псевдоним тонкого типа.Вам нужно, чтобы Index и Integer были на самом деле разными типами, а не просто именами для чего-то другого, что может быть одинаковым в обоих случаях.

    Если вы не возражаете против некоторого arseache, когда этоПри использовании этих типов для арифметики может быть уместным перечисление enoped:

    enum class Index   : std::ptrdiff_t {};
    enum class Integer : int {};
    

    Теперь эти два типа отличаются, но "наследуют" от того, что вы хотите, чтобы они были, и они не будут конфликтовать или даженеявно преобразовывать друг в друга.Он будет работать на ваших платформах UNIXy и на вашем компьютере с Windows .

    Действительно, если эти типы не предполагается для использованияарифметически, тогда свойства enum-объекта enoped на самом деле имеют место.

В общем, я бы хотел избежать typedef.Он используется для сокращения длинных имен (хотя для ясности предпочитаете using X = Y в настоящее время), но почти для всего остального вы просите о той беде, которую нашли здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...