Как вы используете std::vector в XCode + C++?[закрыто]
Вопрос
По разным причинам (и я уверяю вас, что они действительны, поэтому не говорите «используйте Cocoa», пожалуйста), мне приходится работать с XCode, C++, OpenGL, OpenCL (с небольшим количеством GLUT на стороне), чтобы перестроить несколько графических демонстраций на Mac. (исходя из разработки XP + Visual Studio 2005).Проект был создан как инструмент командной строки с использованием «c++ stdc++».
Мой файл Program.h соединяет мои шейдерные объекты вместе, компилирует, связывает и иным образом подготавливает их для использования в качестве шейдерных программ OpenGL.В этом файле содержатся следующие соответствующие строки кода:
#include <vector>
using std::vector;
и в приватном разделе класса:
vector<int> shaderHandles;
и при добавлении дескрипторов шейдера:
shaderHandles.push_back(shaderHandle);
и, наконец, при использовании нажатых дескрипторов шейдера:
for (int s = 0; s < (int) shaderHandles.size(); s++)
{
glAttachShader(handle, shaderHandles[s]);
}
Судя по моему опыту и исследованиям, в C++ в этих строках нет ничего плохого.Однако при компиляции (будь то отладка или выпуск, поэтому это не связано с _GLIBCXX_DEBUG
проблема), генерируются следующие 4 ошибки:
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_bvector.h:916: error: 'size' is not a member of 'std'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/stl_bvector.h:961: error: 'size' is not a member of 'std'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/vector.tcc:350: error: '__old_size' is not a member of 'std'
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/bits/vector.tcc:453: error: '__old_size' is not a member of 'std'
Кроме того, файл, который ссылается на stl_bvector.h и вектор.tcc:
/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/vector
До сих пор многочисленные поиски в Google ничего не дали.Весь этот код безупречно работает в Windows.Хуже того, если я заменю приведенный выше код эквивалентами списка:
#include <list>
using std::list;
и,
list<int> shaderHandles;
и,
for (list<int>::iterator s = shaderHandles.begin(); s != shaderHandles.end(); s++)
{
glAttachShader(handle, *s);
}
Программа работает как положено.
Но нельзя винить в этом ПОЛНОСТЬЮ векторную реализацию, потому что следующая программа:
#include <iostream>
#include <vector>
using std::vector;
int main (int argc, char * const argv[])
{
vector<int> test;
test.push_back(1);
test.push_back(2);
test.push_back(3);
test.clear();
return 0;
}
Работает без проблем.
Я буду рад предоставить дополнительную информацию по мере необходимости.
Пожалуйста, не говорите мне, что мне следует использовать Cocoa/Objective-C;сейчас это не совсем вариант.И хотя для реализации этой функции я могу использовать списки, другие части моей демонстрации переработать не так-то просто.
Решение
Мне ТАК жаль всех.Всего через несколько минут после публикации этого сообщения я решил продолжить работу, отложив эту проблему на потом.Я обнаружил аналогичную проблему с fstream.Когда появилась эта новая информация, появился поиск в Google. Эта тема, и, в конечном счете, решение.
Я определил свои собственные макросы min и max в своих совершенно несвязанных файлах векторной математики.Решением было удалить мои макросы и поставить std::перед минимальными и максимальными вызовами.
Другие советы
Вы проверили документацию Mac SDK, какие функции они объявляют для векторного класса?Может быть, вы установили какие-то флаги компилятора?Также вы можете сделать с вектором то же самое, что и со списком, используя итераторы для сканирования вашего вектора.