小编Seb*_*lke的帖子

成员函数“select”的“this”参数类型为“const SelectParam”,但函数未标记为 const

我正在尝试对多态项调用函数。但我在编译时收到以下错误消息:

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++ polymorphism compiler-errors

3
推荐指数
2
解决办法
1万
查看次数

有没有办法在提供左值和右值重载的同时删除重复代码?

在学习 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++ overloading code-duplication rvalue lvalue

3
推荐指数
1
解决办法
234
查看次数

MSVC:为什么在没有事先声明的情况下使用枚举可以编译?

在使用 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、错误还是功能?

c++ enums declaration visual-c++ language-lawyer

3
推荐指数
1
解决办法
97
查看次数

为什么 std::set 允许我插入重复的(非唯一的)自定义元素?

我需要创建一组自定义项目:

  1. 按优先级排序
  2. 不能有重复的名字。

在这个例子中,我使用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++

0
推荐指数
1
解决办法
94
查看次数