2013-05-06 2 views
0

Может кто-нибудь объяснить мне, почему функция offsetof не работает на STD :: векторов, как показано ниже:Offsetof Функция с станд :: вектор

#include <windows.h> 
#include <iostream> 
#include <vector> 

using namespace std; 

struct FooStruct { 
    double x; 
    double y[10]; 
    std::vector<double> z; 
}; 
int main() { 
    cout << offsetof(FooStruct, x) << endl; 
    cout << offsetof(FooStruct, y[2]) << endl; 
    cout << offsetof(FooStruct, z[2]) << endl; 

    system("Pause"); 
} 

Вызов offsetof(FooStruct, z[2]) производит следующее сообщение об ошибке компиляции:

cannot apply 'offsetof' when 'operator[]' is overloaded

+2

ошибка кажется довольно ясным. – chris

ответ

2

Поскольку offsetof не является функцией, а является макросом и работает только с типами POD или стандартным классом макета в C++ 11. Это только для обратной совместимости с C.

Причина, по которой компилятор отказывается разрешить использовать оператор подписки, все проблемы в стороне, заключается в том, что макрос оценивается во время компиляции, но перегруженный оператор может выполнять некоторую работу при время выполнения, чтобы вычислить результат.

+2

Он также работает для стандартного класса макета с C++ 11. – taocp

+0

@ tacp Хорошая точка, спасибо. Я отредактировал свой ответ! – JustSid

1

offsetof(FooStruct, z[2]) не имеет смысла. Элементы z не содержатся в пределах FooStruct, к ним обращаются через std::vector, в основе которого лежит указатель на другое выделение на куче, в пределах которого можно найти z[2].

В любом случае ошибка (который кажется запутанной, я понимаю), вероятно, появляется из-за std::vector перегрузками operator[], не потому, что ваши class FooStruct перегрузок operator[] (который, предполагая, что мы видим, все определения, это не делает).

Если вы хотите, чтобы найти смещение z[2] по отношению к z[0], можно просто вычислить разницу между &z[0] и &z[2] вроде этого: std::cout << (&z[2] - &z[0]) << '\n';

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