2013-04-11 4 views
4
#include<iostream> 
using namespace std; 
class Foo { 
void Bar(void) const ; 
}; 
int main() 
{ 
    Foo f; 
    cout<<sizeof(f)<<endl; 
} 

Я запустил это на g ++, это не дало мне никакой ошибки компиляции. Кроме того, он выполнил задание o/p 1, которое является правильным. Но я ожидал ошибки при связывании. Является ли этот компилятор зависимым?Почему следующий код компилируется

+3

Почему вы ожидали ошибку от компоновщика? – 2013-04-11 19:25:28

+0

Возможно, потому что 'Foo :: Bar' не определено. – filmor

+1

@filmor И вы видите любое место, где оно используется (то есть, называется или его адрес берется)? – 2013-04-11 19:27:13

ответ

11

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

+0

Мне нравится ваш ответ лучше, чем у меня. – diverscuba23

+0

есть ... вызывающий Bar() делает. Но я не знал об этой зависимости. Кроме того, это в стандарте? – rahul

+0

@rahul По крайней мере ... Прочитайте ответ! «Правило одного определения в стандарте» ... – 2013-04-11 19:32:39

3

Это будет ссылка, потому что нет никаких замечательных ссылок на Foo :: Bar, и там для его определения не требуется. Если бы вы на самом деле пытались позвонить, например, f.bar(), это дало бы вам ошибку.

+0

Другой способ получить ошибку компоновщика - сделать Bar() виртуальным. – jszpilewski

3

Ошибка компоновщика, поскольку все зависимости разрешены.

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

Смежные вопросы