모두. 어떤 이유로 나는이 문장을 초기화하지 않고 C++ priority_queue로 초기화했다. 예 :C++에서 std :: priority_queue 생성자에 인수를 전달할 수 없습니다.
내 의견을 보려면 스크롤 막대를 오른쪽으로 이동하십시오.
class Compare1
{
bool _is_reverse;
public:
Compare1(bool is_reverse = true)
: _is_reverse(is_reverse)
{}
bool operator() (const std::shared_ptr<int> &lhs, const std::shared_ptr<int> &rhs) const
{
return (*lhs > *rhs);
}
};
void test3()
{
Compare1 tester;
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1()); // THIS GIVES ME A ERROR
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1(false)); // THIS GIVES ME A ERROR TOO
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq1; // THIS IS FINE
std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq2(tester); // THIS IS FINE TOO
myq.push(std::make_shared<int>(200));
myq.push(std::make_shared<int>(201));
myq.push(std::make_shared<int>(202));
myq.push(std::make_shared<int>(199));
std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl;
}
나는 내 C++ 확인 - STL과 구현 :
#if __cplusplus < 201103L
template<typename _InputIterator>
priority_queue(_InputIterator __first, _InputIterator __last,
const _Compare& __x = _Compare(),
const _Sequence& __s = _Sequence())
: c(__s), comp(__x)
{
__glibcxx_requires_valid_range(__first, __last);
c.insert(c.end(), __first, __last);
std::make_heap(c.begin(), c.end(), comp);
}
#else
template<typename _InputIterator>
**priority_queue(_InputIterator __first, _InputIterator __last,
const _Compare& __x,
const _Sequence& __s)**
: c(__s), comp(__x)
{
__glibcxx_requires_valid_range(__first, __last);
c.insert(c.end(), __first, __last);
std::make_heap(c.begin(), c.end(), comp);
}
template<typename _InputIterator>
priority_queue(_InputIterator __first, _InputIterator __last,
const _Compare& __x = _Compare(),
_Sequence&& __s = _Sequence())
: c(std::move(__s)), comp(__x)
{
__glibcxx_requires_valid_range(__first, __last);
c.insert(c.end(), __first, __last);
std::make_heap(c.begin(), c.end(), comp);
}
#endif
그리고, 내가이 줄 std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1());
prefectly 유효 생각을하지만 나는 그 컴파일 에러 메시지를 가지고 :
을g++ -g -c -std=c++11 main.cc -o main.o
main.cc: In function ‘void test3()’:
main.cc:100:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
myq.push(std::make_shared<int>(200));
^
main.cc:101:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
myq.push(std::make_shared<int>(201));
^
main.cc:102:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
myq.push(std::make_shared<int>(202));
^
main.cc:103:7: error: request for member ‘push’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
myq.push(std::make_shared<int>(199));
^
main.cc:104:34: error: request for member ‘top’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl;
^
main.cc:104:56: error: request for member ‘size’ in ‘myq’, which is of non-class type ‘std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int> >, Compare1>(Compare1 (*)())’
std::cout << "DEBUG:" << *(myq.top()) << ", " << myq.size() << std::endl;
^
make: *** [main.o] Error 1
누구든지이 예에서 어떤 일이 벌어지고 있는지 말해 줄 수 있습니까? 고마워.
나는 알고있다. std::priority_queue<std::shared_ptr<int>, std::vector<std::shared_ptr<int>>, Compare1> myq(Compare1());
이것은 좋은 습관이 아니다. 이 문이 실행되면 Compare1() object
이 삭제되므로 Compare& _x
은 삭제 된 개체를 나타냅니다.
그러나, cplusplus.com의 예는 몇 가지 이유로 유효합니다.
typedef priority_queue<int,vector<int>,mycomparison> mypq_type;
mypq_type fifth (mycomparison());
mypq_type sixth (mycomparison(true));
나는이 시점에서 꽤 혼란 스럽다.
"C++의 Vexing Parse의 희생자"- 우리는이 슬로건으로 티셔츠를 보내기 시작할 수 있도록 로비해야합니다. – Casey