移动构造函数抱怨"非类类型"

Move Constructor Complaining about "non-class type"

本文关键字:类型 构造函数 移动      更新时间:2023-10-16

所有人,我正在与理解R-Value,L-Value以及Scott Meyers所说的"通用参考"一起玩耍。我在设置自己的示例时遇到了一些麻烦,如下所示。谁能提供一些指导?

#include <cstdio>
namespace who_needs_namespaces {
class SomeSillyClass {
    public:
    SomeSillyClass() {
        printf("Default constructed.n");
    }
    SomeSillyClass(const SomeSillyClass& rhs) {
        printf("L-Value constructed.n");
    }
    SomeSillyClass(SomeSillyClass&& rhs) {
        printf("R-Value Constructed.n");   
    }
    void doStuff() const {
        printf("doing...n");
    }
};
template<typename T>
class HolderByValue {
public:
    HolderByValue() = delete;   
    HolderByValue(T toHold) : m_mine(toHold) 
    { }; 
private:
    T m_mine;
};
template<typename T>
class HolderByRef {
public:
    HolderByRef() = delete;   
    HolderByRef(T&& toHold) : m_mine(toHold)
    { }; 
private:
    T m_mine;
};
}
using namespace who_needs_namespaces;
int main() {
    //Check our silly class.
    SomeSillyClass defaultCtr;
    defaultCtr.doStuff();
    SomeSillyClass copyCtr(defaultCtr);
    copyCtr.doStuff();
    SomeSillyClass moveCtr(SomeSillyClass);
    moveCtr.doStuff();
    //Check our HolderByValue
    //HolderByValue<SomeSillyClass> holder(defaultCtr);
    HolderByValue<SomeSillyClass &> holder(defaultCtr);
}

main.cpp: In function 'int main()':
main.cpp:59:13: error: request for member 'doStuff' in 'moveCtr', which is of non-class type 'who_needs_namespaces::SomeSillyClass(who_needs_namespaces::SomeSillyClass)'

我认为您已经成为斯科特·迈耶斯(Scott Meyers)所说的C 最烦人的解析的受害者。https://en.wikipedia.org/wiki/most_vexing_parse