2015-06-26 3 views
1

В принципе, у меня есть файл .h, в котором я определил функцию для генерации буфера элемента и сжатого списка вершин (для OpenGL) с учетом неоптимизированного списка вершин. Однако я столкнулся с некоторыми проблемами, и оказалось, что я не могу получить доступ к содержимому вектора, который я передаю методу. Мой код выглядит следующим образомКомпилятор дает ошибки при попытке распечатать содержимое вектора?

#ifndef LEARNOPENGL_COMMON_H 
#define LEARNOPENGL_COMMON_H 

#include "ContextBase.h" // this includes all the OpenGL stuff 
#include "vector" 
#include "iostream" 

class common { 
public: 

    template<typename V> 
    static bool are_equal(int size, V* v1, V* v2) { 
     for (int x = 0; x < size; x++) { 
      //if (v1[x] != v2[x]) return false; 
     } 
     return true; 
    } 

    template<typename V, typename E> 
    static void GenOptimizedArrays(const int vertex_size, std::vector<V>* vertex_source, 
            std::vector<V>* vertex_out, std::vector<E>* ebo_out) { 

     std::vector<V> * vertex_vector = new std::vector<V>(); 
     std::vector<E> * element_vector = new std::vector<E>(); 

     std::cout << vertex_source[0] << std::endl; 
    } 
}; 

#endif //LEARNOPENGL_COMMON_H 

Однако мой компилятор говорит мне, что пытается напечатать (доступ?) vertex_source[0] является вызывая error- точное (соответствующее) сообщение об ошибке

error: cannot bind ‘std::ostream {aka std::basic_ostream<char>} 
’ lvalue to ‘std::basic_ostream<char>&& 

Я попытался для поиска в Интернете, но, хотя я нашел похожие проблемы, все, что только что сказал, использовать итератор без объяснения причин почему Я выяснил, как из решений, но не нашел хороших объяснений. Можете ли вы помочь в этом?

+5

vertex_source - это указатель, а не вектор, поэтому ваш код будет таким же, как cout << * vertex_source. Кажется ли тогда проблема очевидной? – QuestionC

+0

Возможно, вы хотели использовать ссылки? например: 'static void GenOptimizedArrays (const int vertex_size, const std :: vector & vertex_source, std :: vector & vertex_out, std :: vector & ebo_out)' таким образом вы можете пропустить перенос векторов alloocations ... – SHR

+0

@QuestionC больно так. Спасибо – pipsqueaker117

ответ

0
std::vector<int> *vec = new vector<int>; 
//std::cout<<vec[0];(1) 
std::cout<<&vec[0];(2) 

Если вы раскомментируете (1) и выполняете над фрагментом, вы получите почти такую ​​же ошибку. Переменная vec знает только о ее адресе, если вы не назначили данные в его местоположение указателя. Поэтому, когда вы пытаетесь получить доступ к данным из своей системы указателей, система не может связывать ее с потоком.

Если вы попытаетесь распечатать адрес, как показано в (2), он напечатает адрес переменной местоположения vec.

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