2016-11-24 4 views
0

すべて、私はr値、l値、および「スコットマイヤー」が「ユニバーサルリファレンス」と呼ぶものを理解して遊んでいます。私は私の例を設定するのにいくつかの問題を抱えています。誰かが何かガイダンスを提供できますか?移動コンストラクタ「非クラス型」に不満

#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)' 
+0

'SomeSillyClass moveCtr(SomeSillyClass);で何をしようとしていますか?コンストラクタに型を渡しますか?関数を宣言する...私はコンパイラが後者を考えると思う。 – doctorlove

+1

'SomeSillyClass moveCtr(SomeSillyClass()));' – doctorlove

答えて

1

私はあなたがスコット・マイヤーズは、C++のほとんどの難問の解析と呼ぶものの犠牲に落ちたんだと思います。 https://en.wikipedia.org/wiki/Most_vexing_parse

+0

これは私が夢中にしようとするものです。ありがとうマイケルとdoctorlove! – Constantin

関連する問題