2013-04-20 2 views
3

У меня есть класс Matrix, который представляет собой набор из s. Типы данных определяются следующим образом:Проблема компиляции с пользовательскими распределителями, когда -std = C++ 0x включен

Row:

template <typename Index> 
class Row { 
public: 

    Row() 
    { 
     _index_vector = std::vector<Index, aligned_allocator<Index> >(); 
    } 

    Row& operator=(const Row& source) 
    { 
     //some copy logic here 
     return *this; 
    } 

private: 
    std::vector<Index, aligned_allocator<Index> >  _index_vector; 
}; 

Матрица:

template <typename Index> 
class Matrix { 
public: 
    typedef std::vector<Row<Index> > Rep; 

    Matrix() : _m (0), _n (0) 
    {} 

    Matrix (size_t n, size_t m) : 
      _m (m), 
      _n (n) 
    { 
     _A = Rep (n); 
    } 

private: 
    Rep  _A; 
    size_t  _m; 
    size_t  _n; 
}; 

Тип данных использует аллокатора, основные функции:

template <class T> 
class aligned_allocator 
{ 
public: 
     //Other methods; members... 

    pointer allocate (size_type size, const_pointer *hint = 0) { 
     pointer p; 
     posix_memalign((void**)&p, 16, size * sizeof (T)); 

     return p; 
    }; 

    void construct (pointer p, const T& value) { 
     *p=value; 
    }; 

    void destroy (pointer p) { 
     p->~T(); 
    }; 

    void deallocate (pointer p, size_type num) { 
     free(p); 
    }; 
}; 

Я использую эту простую программу для тестирования коды:

#include "types.h" 

int main(int argc, char **argv) 
{ 
    Matrix<int> AA (100, 100); 
} 

Когда я компилирую это без -std=c++0x, он компилируется без каких-либо ошибок. Однако, когда -std=c++0x включена, я получаю следующее сообщение об ошибке:

error: invalid operands to binary expression ('_Tp_alloc_type' 
     (aka 'aligned_allocator<int>') and '_Tp_alloc_type') 
     if (__x._M_get_Tp_allocator() == this->_M_get_Tp_allocator()) 

./types.h:26:17: note: in instantiation of member function 'std::vector<int, aligned_allocator<int> >::operator=' requested here 
       _index_vector = std::vector<Index, aligned_allocator<Index> >(); 

Что может быть причиной этого? и возможное исправление/обходное решение. Я использую gcc version 4.7.2 и clang version 3.1.

(извините за длинный код.)

ответ

6

Сообщение об ошибке на самом деле содержит подсказку. Я переформулировать его немного здесь:

error: invalid operands [of type aligned_allocator<int> ] to binary expression […] __x._M_get_Tp_allocator() == this->_M_get_Tp_allocator()

Другими словами, ваш тип Распределитель должен обеспечить operator ==.

Это часть требований распределителя (§17.6.3.5, таблица 28). Это всегда было так. Но до тех пор, пока распределители C++ 11 не были апатрированы и operator ==, следовательно, всегда возвращались true, поэтому стандартные контейнеры библиотеки, вероятно, никогда не вызывали оператора. Это объясняет, почему код компилируется без -std=++0x.

2

Похоже, он хочет aligned_allocator <>, чтобы оператор ==().

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