2012-05-25 93 views
2

我的母語是C#,所以當我開始使用C++時,我想爲C#中可用的庫消費者創建get/set糖語法。iso C++禁止通用類型聲明

所以我寫了...

template<typename T> 
class GetProperty 
{ 
    private: 
     T (*get)(); 
    public: 
     GetProperty(T (*get)()) 
     { 
      this->get = get; 
     } 
     operator T() 
     { 
      return get(); 
     } 
     template<typename S, typename T> 
     GetProperty<S> operator=(GetProperty<T> fool) 
     { 
      throw 0; 
     } 
}; 

然後,利用這一點,我寫的代碼:

template<typename T> 
class Vector 
{ 
    private: 
     struct LinkItem 
     { 
      public: 
       T* Item; 
       LinkItem* Next; 
           GetProperty<int> Length (&getLength); 
       LinkItem(T* Item = NULL, int length = 1, LinkItem* Next = NULL) 
       { 
        this->Item = Item; 
        this->length = length; 
        this->Next = Next; 
       } 
       LinkItem& operator =(LinkItem rhs) 
       { 
        this->Item = rhs.Item; 
        this->length = rhs.length; 
        this->Next = rhs.Next; 
        return *this; 
       } 
      private: 
       int length; 
       int getLength() 
       { 
        return length; 
       } 
     }; 
     LinkItem* current; 
    . 
    . 
    . 
}; 

然而,C/C++另外的NetBeans(我相信這是g ++編譯器)聲稱我沒有類型實例化GetProperty。
根據Google搜索,如果有人忘記了使用聲明或包含標題等,則會發生這種情況。
但是int是原語,所以這不可能。
發生了什麼事?

+1

'junior.goeat();' – Jack

+0

此代碼根本無法編譯:http://ideone.com/qfH21 –

+0

@MooingDuck:謝謝。 – Jack

回答

0

除了VC++沒有實現非靜態數據成員初始值設定項的事實外,您不能將成員函數getLength視爲int (*)()。它的類型是int (LinkItem::*)()

struct Foo { 
    int foo(void) {return 1;} 
}; 

int main() { 
    int (*var)() = &Foo::foo; // Error 
    int (Foo::*var)() = &Foo::foo; // Okay 
} 

你可能不應該試圖像這樣導入一個外國成語,但如果你真的想要你可以嘗試類似下面的東西。 (雖然Nicol Bolas指出,你也可能不應該實現你自己的鏈表,或者命名它爲'vector'。如果你正在學習C++,那麼在去之前學習C++的方式並試圖重新創造事物。)

#include <functional> 

template<typename T> 
class GetProperty 
{ 
private: 
    std::function<int()> get; 
public: 
    GetProperty(std::function<int()> get) 
     : get(get) 
    {} 
    operator T() 
    { 
     return get(); 
    } 
}; 

template<typename T> 
class Vector 
{ 
private: 
    struct LinkItem 
    { 
    public: 
     T* Item; 
     LinkItem* Next; 
     GetProperty<int> Length; 
     LinkItem(T* Item = NULL, int length = 1, LinkItem* Next = NULL) 
      : Length([this] { return this->getLength(); }) 
     { 
... 
+0

是的。我只想寫一個鏈接列表來了解算法,並且我發現寫get_Variable和set_Variable調用很煩人,因爲它們在不增加含義的情況下添加了鍵入。 我當然不應該嘗試導入類似這樣的東西。 – user1417475

1

您正在構造GetProperty對象,同時在結構中聲明它。這在C++中是不允許的。您必須將構造移到構造函數中。

+1

C++ 11允許使用它,但VC++尚未實現它。 – bames53

相關問題