2016-02-15 5 views
0

Я пытаюсь построить Google OR-Tools пример на OSX 10.11.3Как исправить ошибку синтаксиса шаблона двойного угла C++ 03 в Google OR-Tools?

Когда я бегу:

g++ -I../include/ -L../lib -lortools -Wno-c++11-extensions nqueens2.cc 

In file included from nqueens2.cc:25: 
In file included from ../include/constraint_solver/constraint_solver.h:65: 
In file included from ../include/base/hash.h:19: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ext/hash_map:212:5: warning: Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> [-W#warnings] 
# warning Use of the header <ext/hash_map> is deprecated. Migrate to <unordered_map> 
    ^
In file included from nqueens2.cc:25: 
In file included from ../include/constraint_solver/constraint_solver.h:65: 
In file included from ../include/base/hash.h:20: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ext/hash_set:205:5: warning: Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> [-W#warnings] 
# warning Use of the header <ext/hash_set> is deprecated. Migrate to <unordered_set> 
    ^
In file included from nqueens2.cc:25: 
In file included from ../include/constraint_solver/constraint_solver.h:65: 
../include/base/hash.h:184:31: error: expected expression 
struct hash<std::array<T, N>> { 
          ^
../include/base/hash.h:201:2: error: expected a type 
}; 
^ 
2 warnings and 2 errors generated. 

Я думаю, что проблема в том, что компилятор включая /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ext/hash_map, когда я хочу, чтобы включить его из ../include.

Ошибка вызывает код ниже от ../include/base/hash.h (который поставляется с Google OR-Tools):

183 template <class T, std::size_t N> 
184 struct hash<std::array<T, N>> { 
185 public: 
186 size_t operator()(const std::array<T, N>& t) const { 
187  uint64 current = 71; 
188  for (int index = 0; index < N; ++index) { 
189  const T& elem = t[index]; 
190  const uint64 new_hash = hash<T>()(elem); 
191  current = operations_research::Hash64NumWithSeed(current, new_hash); 
192  } 
193  return current; 
194 } 
195 // Less than operator for MSVC. 
196 bool operator()(const std::array<T, N>& a, const std::array<T, N>& b) const { 
197  return a < b; 
198 } 
199 static const size_t bucket_size = 4; // These are required by MSVC 
200 static const size_t min_buckets = 8; // 4 and 8 are defaults. 
201 }; 
202 #endif // STLPORT 
203 } // namespace HASH_NAMESPACE 

Есть мысли?

+1

В старом компиляторе g ++ не допускается использование двух '' 'в строке для объявления шаблона, потому что оно появилось как оператор' >> '. Итак, когда ваш код смотрит на объявление структуры, он видит '' 'brace вместо выражения для оператора' >> '. Это было изменено в более поздних версиях C++, и g ++ соответственно изменился. – callyalater

+0

@callyalater большое спасибо - позвольте мне попробовать, что – user1172468

+0

@callyalater, который работал – user1172468

ответ

2

старый г ++ компилятор не позволяет в течение двух > подряда для декларации шаблона, потому что он появился как >> оператора. Итак, когда ваш код смотрит на объявление структуры, он видит скобу { вместо выражения для оператора >>. Это было изменено в более поздних версиях C++, и g ++ соответственно изменился.

Компилятор C++ 03 дал указание, что >> интерпретируется как оператор сдвига справа. Это было изменено в стандарте C++ 0x.

1

Ненавижу задань включает в себя с путем каталога в исходном коде, но это могло бы решить эту проблему: #include "../include/hash_map

+0

большое спасибо за сообщение - я думаю, проблема было то, что мой компилятор g ++ ошибся в определении шаблона >>, который должен быть>> как указано предыдущим комментатором. благодаря – user1172468