2

私の母国語はC#なので、C ++を使い始めたとき、C#で使用できるライブラリコンシューマー用のget /setsugar構文を作成したいと思いました。

だから私は書いた...

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;
    .
    .
    .
};

ただし、NetbeansでのC / C ++の追加(これはg ++コンパイラだと思います)は、型なしでGetPropertyをインスタンス化していると主張しています。
Googleの検索によると、これは誰かがusingステートメントを忘れたり、ヘッダーなどを含めたりした場合に発生します。
ただし、intはプリミティブであるため、これは不可能です。
どうしたの?

4

2 に答える 2

1

構造体で宣言しながらGetPropertyオブジェクトを作成しています。これはC++では許可されていません。構造をコンストラクターに移動する必要があります。

于 2012-05-25T16:01:34.923 に答える
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が指摘しているように、独自のリンクリストを実装したり、「ベクトル」という名前を付けたりするべきではありません。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(); })
        {
...
于 2012-05-25T17:11:12.410 に答える