Вопрос

По разным причинам (и я уверяю вас, что они действительны, поэтому не говорите «используйте 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, какие функции они объявляют для векторного класса?Может быть, вы установили какие-то флаги компилятора?Также вы можете сделать с вектором то же самое, что и со списком, используя итераторы для сканирования вашего вектора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top