相关疑难解决方法(0)

什么是复制和交换习语?

这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?

虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:

c++ c++-faq copy-constructor assignment-operator copy-and-swap

1907
推荐指数
5
解决办法
34万
查看次数

强制某些运营商成为成员的理由

C++中有4个运算符可以重载但不能作为独立(即非成员,独立)函数重载.这些运营商是:

  • operator =
  • operator ()
  • operator ->
  • operator []

这个主题完全解释了禁止operator =成为非成员函数的理由.关于其他三个的任何想法?

c++ operator-overloading c++-faq

22
推荐指数
1
解决办法
1544
查看次数

在 C++ 中取消引用指向易失性结构的指针

我有一个指向某些易失性内存的指针,我试图取消引用该内存并将其复制到该结构的非限定副本(反之亦然)。存储器的格式由第三方结构定义指定。在 C 中,我可以取消引用内存,一切都很好。然而,C++抱怨它找不到合适的赋值运算符(clang的错误在这里比gcc清楚得多:候选函数(隐式复制赋值运算符)不可行:'this'参数具有类型'易失性vec',但方法是未标记为易失性)。此方法对于简单类型(例如整数)非常有效,但对于结构则失败。

在这种特殊情况下,所指向的值在读取对象期间不能更改,但我必须防止它们在读取过程中被缓存。

我发现我可以添加从易失性 T 到 T 的隐式转换吗?这给了我很多尝试的选择,但是我无法找到让它真正发挥作用的魔力。我怀疑所有这些解决方案都会失败,因为为什么不能使用非成员函数来重载赋值运算符?这将导致我的第三方定义的结构没有合适的结构,因为结构定义是第三方的,但这是理论上的,因为我什至无法让手动指定的成员函数完全工作(也许我可以创建一个包装结构有明确的东西吗?)。

下面的示例在 C 中编译并运行,但在 C++ 中失败。不幸的是,更完整的问题还有其他方面迫使 C++ 这样做。让它发挥作用的魔力是什么?

    #include <stdio.h>
    #include <stdint.h>
    struct __attribute__((__packed__)) vec {
      uint32_t addr;
      uint32_t len:24;
      uint8_t id;
    };
    struct vec first = { .addr=0xfeedface, .len=10, .id=5};
    volatile struct vec vvector;
    int main(int argc, char **argv, char **envp)
    {
      struct vec cvector;
      volatile struct vec *pvector = &vvector;
      *pvector = first;
      cvector = *pvector;
      printf("%x %d %d %d\n", cvector.addr, cvector.len, cvector.id, sizeof(cvector)); …
Run Code Online (Sandbox Code Playgroud)

c++ casting operator-overloading volatile

13
推荐指数
1
解决办法
839
查看次数

重载operator =作为非成员

根据对这个帖子的回复,operator=不能作为非成员函数重载.因此,例如,以下内容使编译器非常生气:

class MyClass
{
    // ...
};

MyClass& operator=(MyClass& Left, MyClass& Right)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?我有一个带getter和setter的容器类,因此不需要成员函数,它会破坏封装.上述线程的答案之一是说确保"L值被接收为其第一个操作数",但我不完全理解这意味着什么.有人可以澄清一下吗?

此外,有operator=,operator(),operator[]operator->"古怪"的情况下......?或者我应该将所有重载的运算符实现为成员函数......?(我知道不这样做是完全合法的,但我正在寻找更好的做法.)

c++ oop encapsulation operator-overloading assignment-operator

10
推荐指数
1
解决办法
4897
查看次数

运算符重载

为什么重载operator =强制要求成为成员函数($ 13.5.3),而不是复合赋值运算符,例如operator + =($ 13.5.2)?我在这里俯瞰什么吗?

c++ operator-overloading

8
推荐指数
1
解决办法
309
查看次数

C++错误C2801:'operator ='必须是非静态成员

我试图operator=在模板类中重载.

我有这个模板类:

template <class T>
class Matrice
{
    T m,n;
public:
    template <class V>
    friend Matrice<V>& operator=(const Matrice<V> &);
};

template <class T>
Matrice<T>& Matrice<T>::operator=(const Matrice<T> &M)
{
    /*...*/
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

template <class T>
class Matrice
{
    T m,n;
public:
    template <class V>
    Matrice<V>& operator=(Matrice<V> &);
};

template <class T>
Matrice<T>& operator=(Matrice<T> &M)
{
    /*...*/
    return *this;
}
Run Code Online (Sandbox Code Playgroud)

但我仍然得到这个错误:

error C2801: 'operator =' must be a non-static member
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading class operator-keyword

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