Pergunta

Por várias razões (e eu garanto que elas são válidas, portanto, não "use cacau", por favor), devo trabalhar com Xcode, C ++, OpenGL, OpenCL (com um pouco de excesso de lado) para reconstruir alguns demos gráficos no Mac no Mac (vindo do desenvolvimento do XP + Visual Studio 2005). O projeto foi construído como uma ferramenta de linha de comando usando "C ++ STDC ++".

Meu arquivo program.h conecta meus objetos de shader, compila, links e os prepara para uso como programas de shader openGL. Contidos neste arquivo estão as seguintes linhas de código relevantes:

#include <vector>
using std::vector;

e dentro da seção particular da classe:

vector<int> shaderHandles;

E ao adicionar alças de shader:

shaderHandles.push_back(shaderHandle);

E finalmente, ao usar as alças do shader empurrado:

for (int s = 0; s < (int) shaderHandles.size(); s++)
{
    glAttachShader(handle, shaderHandles[s]);
}

Em toda a minha experiência e pesquisa, não há nada de errado com essas linhas no C ++. No entanto, ao compilar (seja depuração ou liberação, portanto não está relacionado ao _GLIBCXX_DEBUG problema), os 4 erros a seguir são gerados:

/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'

Além disso, o arquivo que links para stl_bvector.h e vetor.tcc é:

/Developer/SDKs/MacOSX10.6.sdk/usr/include/c++/4.2.1/vector

Até agora, inúmeras pesquisas no Google não aumentaram nada. Todo esse código funciona perfeitamente no Windows. Pior, se eu substituir o código acima pelos equivalentes da lista:

#include <list>
using std::list;

e,

list<int> shaderHandles;

e,

for (list<int>::iterator s = shaderHandles.begin(); s != shaderHandles.end(); s++)
{
    glAttachShader(handle, *s);
}

O programa funciona conforme o esperado.

Mas não se pode culpar isso inteiramente pela implementação do vetor, porque o seguinte programa:

#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;
}

Funciona sem problemas.

Ficarei feliz em fornecer mais informações conforme necessário.

Por favor, não me diga que eu deveria usar cacau/objective-c; Não é realmente uma opção agora. E, embora sim, posso usar listas para realizar essa funcionalidade, outras partes da minha demonstração não são tão fáceis de retrabalhar.

Foi útil?

Solução

Sinto muito a todos. Poucos minutos depois de postar isso, decidi continuar com o que pude, salvando esse problema para mais tarde. Encontrei um problema semelhante ocorrendo com o Fream. Com esta nova informação disponível, uma pesquisa no Google trouxe à tona Este tópico, e, finalmente, a solução.

Eu havia definido meus próprios MIN e Max Macros em meus arquivos de matemática vetorial completamente não relacionados. A solução foi remover minhas macros e colocar o std :: em frente às chamadas Min e Max.

Outras dicas

Você verificou a documentação do MAC SDK, que funções eles declaram para a classe vetorial? Talvez você tenha definido algumas bandeiras do compilador? Além disso, você pode fazer o mesmo com o vetor que fez para a lista, usando iteradores para digitalizar através do seu vetor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top