Я пытаюсь построить Google OR-Tools пример на OSX 10.11.3
Когда я бегу:
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
Какие-нибудь мысли?
Старый компилятор g ++ не допускал двух >
в строке для объявления шаблона, потому что он появился как >>
оператор. Итак, когда ваш код смотрит на объявление структуры, он видит {
скобка вместо выражения для >>
оператор. Это было изменено в более поздних стандартах c ++ и g ++ изменилось соответственно.
Компилятор C ++ 03 обязал >>
интерпретировать как оператор сдвига вправо. Это было изменено в стандарте C ++ 0x.
Я ненавижу указывать include с путем к каталогу в исходном коде, но это может решить проблему: #include "../include/hash_map