我正在尝试对多态项调用函数。但我在编译时收到以下错误消息:
this成员函数“ ”的参数“select”具有类型“const SelectParam”,但未标记函数const
错误显示在 p->selection(*it)
std::set<Tuple>::iterator it;
for (it = tuples.begin(); it != tuples.end();) {
for (const SelectParam* p: selectionParams) {
bool successful = p->select(*it);
if( !successful ) {
it = tuples.erase(it);
} else {
it++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是这些类的定义方式。(我过去没有所有的 const 并且 & 就在那里,但我把它们放在了我能想到的任何地方,希望我能做出任何它想要的 const 但显然我没有解决这个问题,因为它没有改变任何东西。
在存储在父指针的子类之一中。
bool const select(Tuple const & tup) {
bool matched = false;
if (tup[idx] == val) {
matched = true;
}
return matched;
}
Run Code Online (Sandbox Code Playgroud)
在与多态一起使用的另一个子类中
bool const …Run Code Online (Sandbox Code Playgroud) 在学习 C++ 时,我决定编写一个简单的模板化二叉搜索树 (bst) 并遇到以下问题:我希望能够通过传递左值和右值来构造一个 bst 。同样,我希望能够插入左值和右值。所以我最终得到了很多我不喜欢的重复代码:const T &valT &&val
/// copy constructor
explicit inline constexpr binary_search_tree(const T &val)
: _root{std::make_unique<binary_search_tree_node>(val)} {}
/// move constructor
explicit inline constexpr binary_search_tree(T &&val)
: _root{std::make_unique<binary_search_tree_node>(std::move(val))} {}
Run Code Online (Sandbox Code Playgroud)
对于构造函数, wherebinary_search_tree_node是其私有成员binary_search_tree,然后还必须提供复制和移动构造函数:
struct binary_search_tree_node {
T value;
std::unique_ptr<binary_search_tree_node> left;
std::unique_ptr<binary_search_tree_node> right;
// prohibit creation of tree_node without value
inline constexpr binary_search_tree_node() = delete;
/// copy constructor
explicit inline constexpr binary_search_tree_node(const T &val)
: value{val}, left{nullptr}, right{nullptr} {} …Run Code Online (Sandbox Code Playgroud) 在使用 C++ 时,我发现以下代码
enum E* kind;
int main() { }
Run Code Online (Sandbox Code Playgroud)
在 MSVC v19.latest 上编译。我预计这会失败,因为E尚未宣布。GCC 和 Clang 给出适当的错误消息
错误:使用枚举“E”而没有事先声明
和
错误:ISO C++ 禁止前向引用“enum”类型
分别。
为什么上面的代码可以在MSVC上编译?MSVC 不遵循标准吗?是 UB、错误还是功能?
我需要创建一组自定义项目:
在这个例子中,我使用std::set和一个重载的operator<( )。据我所知,std::set使用operator<( )进行排序和唯一性检查。但是我的代码失败了,因为我能够插入具有重复名称的项目:
#include <iostream>
#include <set>
struct Item
{
std::string name;
int priority;
};
bool operator<( const Item& a, const Item& b )
{
// Always returns false if names are equal.
// Set should consider elements equal when a < b is false and b < a is also false.
if( a.name == b.name )
return false;
return ( a.priority < b.priority );
}
int main()
{ …Run Code Online (Sandbox Code Playgroud) c++ ×4
declaration ×1
enums ×1
lvalue ×1
overloading ×1
polymorphism ×1
rvalue ×1
visual-c++ ×1