Ошибка компиляции Typedef при перегрузке функции - PullRequest
3 голосов
/ 26 февраля 2010

Почему я не могу скомпилировать программу 1, когда программа 2 работает нормально? Почему это поведение отличается?

Программа 1:

#include <iostream>
typedef int s1;
typedef int s2;

void print(s1 a){ std::cout << "s1\n"; }
void print(s2 a){ std::cout << "s2\n"; }

int main() {
        s1 a;
        s2 b;

        print(a);
        print(b);

        return 0;
}

Программа 2:

#include <iostream>
typedef struct{int a;} s1;
typedef struct{int a;} s2;

void print(s1 a){ std::cout << "s1\n"; }
void print(s2 a){ std::cout << "s2\n"; }
int main() {
        s1 a;
        s2 b;

        print(a);
        print(b);

        return 0;
}

Это ошибка воспроизведения из шаблонного класса. Как я могу проверить, являются ли два аргумента шаблона одного типа (в случае программы 1)

Ответы [ 3 ]

10 голосов
/ 26 февраля 2010

Typedefs не определяют новые типы, они просто создают псевдонимы для существующих типов. В вашей первой программе s1 и s2 являются псевдонимами для int. В вашей второй программе это псевдонимы для двух разных структур, которые просто идентичны по структуре.

Вы могли бы назначить имена двум структурам, которые сделали бы это более понятным:

// Semantically identical to program 2
typedef struct a {int a;} s1;
typedef struct b {int a;} s2;

С другой стороны, если вы сделали их псевдонимами для того же типа , то вторая программа потерпит неудачу, как и первая:

// Different from program 2. This will draw a compile error.
struct s {int a;};
typedef struct s s1;
typedef struct s s2;
2 голосов
/ 26 февраля 2010

int - это примитивный тип: независимо от того, где вы его используете, он всегда будет ссылаться на точно одно и то же - int.

struct{int a;} не является примитивным типом - каждый раз, когда вы определяете struct{int a;}, вы создаете новый тип - следовательно, почему s1 и s2 считаются различными в вашем случае Программы 2.

Например, рассмотрим следующее:

typedef struct{int count;} apples;
typedef struct{int count;} airplanes;

Яблоки и самолеты - это одно и то же? Возможно нет. Но их количество является числовым. Следовательно, почему int является последовательным, а structs нет - int не имеет никакого контекста, связанного с ним, структуры делают.

typedef на самом деле не создает никаких новых типов - он только псевдоним типа под другим именем.

Следовательно, разница между Программой 1 и Программой 2 состоит в том, что в Программе 1 вы пытаетесь определить две версии функции с (с точки зрения компилятора) абсолютно одинаковой подписью: print(int). В программе 2 вы определяете две разные подписи: print([first struct type]) и print([second struct type]).

0 голосов
/ 26 февраля 2010

Разница в том, что в программе 1 s1 и s2 являются псевдонимами одного типа, тогда как в программе 2 это разные типы. Вы не можете определить две перегрузки функции с одной и той же сигнатурой, даже если вы используете разные имена типов для создания этой сигнатуры.

...