//Файл A.cpp
class A
{
public:
int func( int i )
{
return i*i;
}
};
//Файл Test.cpp
#include
class A
{
public:
int func( int i )
{
return i*i*i;
}
};
int main()
{
A a;
cout<
Дополню вопрос.
Если переписать файл "A.cpp" так:
class A
{
public:
int func( int i );
};
int A::func( int i )
{
return i*i;
}
То ошибка будет!!!
С функциями аналогичная ситуация. Приведённый ниже код работать не будет.
//A.cpp
int func( int i )
{
return i*i;
}
//Test.cpp
#include
int func( int i )
{
return i*i*i;
}
int main()
{
cout<
Ответ
Согласно стандарту языка (правилу ODR) классы с external linkage (внешним связыванием), определенные в нескольких единицах трансляции, должны быть определены одинаково во всех этих единицах трансляции. Но диагностики этого не требуется.
Точно так же, по ODR, inline-функции с external linkage, определенные в нескольких единицах трансляции, должны быть определены одинаково во всех этих единицах трансляции. Но диагностики этого не требуется.
В вашем исходном примере наличествуют как раз две таких сущности - класс с external linkage и inline-функция с external linkage.
Т.е. спецификация языка требует, чтобы эти сущности были определены одинаково во всех единицах трансляции, но следить за этой одинаковостью - в общем случае ваша задача. Продвинутый компилятор может помочь вам ловить такие ошибки, но это просто вопрос качества реализации.
Как только ваша функция перестала быть inline, диагностика для нарушений ODR для такой функции сразу же формально потребовалась и компилятор ее успешно вам предоставил.
Комментариев нет:
Отправить комментарий