【发布时间】:2012-01-14 00:37:15
【问题描述】:
#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 );
}
上面例子的编译产生下一个错误:
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&)
我使用 g++(4.6.1 版)编译如下:
g++ -O3 -std=c++0x -Wall -Wextra -pedantic dk2.cpp
问题是为什么会发生这种情况? vector<bool>::reference 不是 bool&?还是编译器的错误?
或者,我在尝试一些愚蠢的事情吗? :)
【问题讨论】:
-
不幸的是,尽管有它的名字,
std::vector<bool>并不是bool的vector。 -
作为一种解决方法,您可以使用
std::unique_ptr<bool[]>(new bool[3])... -
Herb Sutter 的When Is a Container Not a Container? 就是关于这个问题的。
-
Howard Hinnant 的文章 On vector<bool> 说这是一个很好的优化,只是名称应该被更改为不表示标准容器的更大含义。
标签: c++ compiler-errors g++