将字符串推送到私有成员向量
Pushing a string to a private member vector
我有一个std::vector<std::string> tileSet_
作为class的成员变量。在上述 class 的构造函数中,我调用函数
void MapWindow::shuffleTiles() const
{
std::vector<std::pair<std::string, unsigned>> tileAmounts = {
{"a", 2}, {"b", 4}, {"c", 1}, {"d", 4},
{"e", 5}, {"f", 2}, {"g", 1}, {"h", 3},
{"i", 2}, {"j", 3}, {"k", 3}, {"l", 3},
{"m", 2}, {"n", 3}, {"o", 2}, {"p", 3},
{"q", 1}, {"r", 3}, {"s", 2}, {"t", 1},
{"u", 8}, {"v", 9}, {"w", 4}, {"x", 1}
};
int tileN = 0;
for (std::vector<std::pair<std::string, int>>::size_type i = 0;
i < tileAmounts.size();i++) {
tileN += tileAmounts.at(i).second;
}
// only used once to initialise (seed) engine
std::random_device rd;
// random-number engine used (Mersenne-Twister in this case)
std::mt19937 rng(rd());
// guaranteed unbiased
std::uniform_int_distribution<int> uni(0,tileAmounts.size() - 1);
for (int i = 0; i < tileN; i++) {
auto random_integer = uni(rng);
//qDebug() << i << ":" << random_integer;
std::cout << i
<< ":"
<< tileAmounts.at(random_integer).first
<< ":"
<< tileAmounts.at(random_integer).second
<< std::endl
<< std::endl;
while (tileAmounts.at(random_integer).second < 1) {
std::cout << "Reshuffling "
<< tileAmounts.at(random_integer).first
<< ":"
<< tileAmounts.at(random_integer).second
<< std::endl;
random_integer = uni(rng);
}
std::string s = tileAmounts[random_integer].first;
std::cout << s
<< std::endl;
tileSet_.push_back(s);
tileAmounts.at(random_integer).second -= 1;
}
for (std::vector<std::string>::size_type i = 0;
i < tileSet_.size();i++) {
std::cout << tileSet_.at(i)
<< std::endl;
}
}
它在最后尝试将向量 tileAmounts
中包含的一对随机选取的字符串推回到 memeber 向量中。出于某种原因,这引发了错误
no matching member function call to 'push_back'
为什么会这样。我正在将矢量从 std::pair
推回,但肯定不会导致任何类型不匹配? std::vector
中包含的std::pair
中的std::string
仍然是std::string
,不是吗?
我找到了问题的根源:vectortileSet_
以前不是成员变量,但我出于需要才这样做的。但是,我最初将函数 shuffleTiles
定义为 const
函数,这当然使它无法更改 class 的状态。从定义中删除 const
解决了这个问题。
C++ 中的错误消息肯定是神秘的。
我花了一些时间才完成所有的构建(有一些猜测)。
问题是该方法被标记为const
。因此,您不允许在成员上调用任何可变函数(即您不能在任何成员变量上调用 none const 成员函数或 none const 成员函数)。
void MapWindow::shuffleTiles() const
^^^^^
...
tileSet_.push_back(s); // Attempt to mutate the state of the object.
这在编译器生成的错误消息中有更详细的解释:
t2.cpp:61:14: error: no matching member function for call to 'push_back'
tileSet_.push_back(s);
~~~~~~~~~^~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:712:36: note: candidate function not viable: 'this' argument has type
'const std::vector<std::string>' (aka 'const vector<basic_string<char, char_traits<char>, allocator<char> > >'), but method is not marked const
_LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:715:36: note: candidate function not viable: 'this' argument has type
'const std::vector<std::string>' (aka 'const vector<basic_string<char, char_traits<char>, allocator<char> > >'), but method is not marked const
_LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
如果您转到行尾,它会显示:“但方法未标记为常量”
解密行:
note: candidate function not viable: 'this' argument has type
'const std::vector', but method is not marked const
void push_back(const_reference __x);
note: candidate function not viable: 'this' argument has type
'const std::vector', but method is not marked const
void push_back(value_type&& __x);
我有一个std::vector<std::string> tileSet_
作为class的成员变量。在上述 class 的构造函数中,我调用函数
void MapWindow::shuffleTiles() const
{
std::vector<std::pair<std::string, unsigned>> tileAmounts = {
{"a", 2}, {"b", 4}, {"c", 1}, {"d", 4},
{"e", 5}, {"f", 2}, {"g", 1}, {"h", 3},
{"i", 2}, {"j", 3}, {"k", 3}, {"l", 3},
{"m", 2}, {"n", 3}, {"o", 2}, {"p", 3},
{"q", 1}, {"r", 3}, {"s", 2}, {"t", 1},
{"u", 8}, {"v", 9}, {"w", 4}, {"x", 1}
};
int tileN = 0;
for (std::vector<std::pair<std::string, int>>::size_type i = 0;
i < tileAmounts.size();i++) {
tileN += tileAmounts.at(i).second;
}
// only used once to initialise (seed) engine
std::random_device rd;
// random-number engine used (Mersenne-Twister in this case)
std::mt19937 rng(rd());
// guaranteed unbiased
std::uniform_int_distribution<int> uni(0,tileAmounts.size() - 1);
for (int i = 0; i < tileN; i++) {
auto random_integer = uni(rng);
//qDebug() << i << ":" << random_integer;
std::cout << i
<< ":"
<< tileAmounts.at(random_integer).first
<< ":"
<< tileAmounts.at(random_integer).second
<< std::endl
<< std::endl;
while (tileAmounts.at(random_integer).second < 1) {
std::cout << "Reshuffling "
<< tileAmounts.at(random_integer).first
<< ":"
<< tileAmounts.at(random_integer).second
<< std::endl;
random_integer = uni(rng);
}
std::string s = tileAmounts[random_integer].first;
std::cout << s
<< std::endl;
tileSet_.push_back(s);
tileAmounts.at(random_integer).second -= 1;
}
for (std::vector<std::string>::size_type i = 0;
i < tileSet_.size();i++) {
std::cout << tileSet_.at(i)
<< std::endl;
}
}
它在最后尝试将向量 tileAmounts
中包含的一对随机选取的字符串推回到 memeber 向量中。出于某种原因,这引发了错误
no matching member function call to 'push_back'
为什么会这样。我正在将矢量从 std::pair
推回,但肯定不会导致任何类型不匹配? std::vector
中包含的std::pair
中的std::string
仍然是std::string
,不是吗?
我找到了问题的根源:vectortileSet_
以前不是成员变量,但我出于需要才这样做的。但是,我最初将函数 shuffleTiles
定义为 const
函数,这当然使它无法更改 class 的状态。从定义中删除 const
解决了这个问题。
C++ 中的错误消息肯定是神秘的。
我花了一些时间才完成所有的构建(有一些猜测)。
问题是该方法被标记为const
。因此,您不允许在成员上调用任何可变函数(即您不能在任何成员变量上调用 none const 成员函数或 none const 成员函数)。
void MapWindow::shuffleTiles() const
^^^^^
...
tileSet_.push_back(s); // Attempt to mutate the state of the object.
这在编译器生成的错误消息中有更详细的解释:
t2.cpp:61:14: error: no matching member function for call to 'push_back'
tileSet_.push_back(s);
~~~~~~~~~^~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:712:36: note: candidate function not viable: 'this' argument has type
'const std::vector<std::string>' (aka 'const vector<basic_string<char, char_traits<char>, allocator<char> > >'), but method is not marked const
_LIBCPP_INLINE_VISIBILITY void push_back(const_reference __x);
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/vector:715:36: note: candidate function not viable: 'this' argument has type
'const std::vector<std::string>' (aka 'const vector<basic_string<char, char_traits<char>, allocator<char> > >'), but method is not marked const
_LIBCPP_INLINE_VISIBILITY void push_back(value_type&& __x);
如果您转到行尾,它会显示:“但方法未标记为常量”
解密行:
note: candidate function not viable: 'this' argument has type
'const std::vector', but method is not marked const
void push_back(const_reference __x);note: candidate function not viable: 'this' argument has type
'const std::vector', but method is not marked const
void push_back(value_type&& __x);