#include <vector>
struct A
{
void foo(){}
};
template< typename T >
void callIfToggled(bool v1, bool &v2, T & t)
{
if (v1 != v2)
{
v2 = v1;
t.foo();
}
}
int main()
{
std::vector<bool> v= { false, true, false };
const bool f = false;
A a;
callIfToggled(f, v[0], a);
callIfToggled(f, v[1], a);
callIfToggled(f, v[2], a);
}
Việc biên soạn các ví dụ trên tạo ra lỗi tiếp theo:Tại sao vector <bool> :: tham chiếu không trả về tham chiếu đến bool?
dk2.cpp: In function 'int main()':
dk2.cpp:29:28: error: no matching function for call to 'callIfToggled(const bool&, std::vector<bool>::reference, A&)'
dk2.cpp:29:28: note: candidate is:
dk2.cpp:13:6: note: template<class T> void callIfToggled(bool, bool&, T&)
tôi biên soạn sử dụng g ++ (phiên bản 4.6.1) như thế này:
g++ -O3 -std=c++0x -Wall -Wextra -pedantic dk2.cpp
Câu hỏi đặt ra là tại sao điều này xảy ra? Có phải vector<bool>::reference
không phải là bool&
? Hay là lỗi của trình biên dịch?
Hoặc, tôi đang thử điều gì đó ngu ngốc? :)
Thật không may, mặc dù tên của nó, 'std :: vector' không phải là 'vectơ' của' bool'. –
Như một giải pháp thay thế, bạn có thể sử dụng 'std :: unique_ptr (new bool [3])' ... –
[Khi nào một Container không phải là một Container?] (Http://www.gotw.ca/publications) /mill09.htm) chỉ là về vấn đề này. – legends2k