1

以下のコードの何が問題になっていますか?最新バージョンのg++とclangはどちらもエラーになります。私はここで基本的な何かが欠けていると確信しています。

#include <iostream>

struct Z
{
  static const int mysize = 10; 
};

Z f2();

int main()
{
    std::cout << f2()::mysize << std::endl;
}

ここでの動機は、以下のようなコードを使用してテンプレートを使用して配列のサイズを見つけることができるようにすることです。いろいろな方法があることは知っていますが、このアイデアに出くわしました。

template<int N> struct S
{
    enum { mysize = N };
};

template<class T, int N> S<N> f(T (&)[N]);

int main()
{
    char buf[10];
    std::cout << f(buf)::mysize << std::endl;
}
4

4 に答える 4

4

f2()タイプではなく値を返します。.代わりに、戻り値に演算子を使用する必要があります::

::演算子では、左側に型に名前を付ける必要があります.が、値に名前を付けることもできます。式f2()は型に名前を付けていないため、。と組み合わせて使用​​することはできません::

ちなみに、質問の詳細をもう少し詳しく説明すると、実際の問題を解決できる可能性があります。

于 2013-01-22T14:43:56.510 に答える
0

Why don't you use this way to find out the size of array by templates:

#include <iostream>

template<int N> struct S
{
    enum { mysize = N };
};

template<class T, int N> int f1(T (&)[N])
{
        return N;
}

int main()
{
    char buf[10];
    std::cout << f1(buf) << std::endl;

}

And this one is closer to your variant:

template<class T, int N> S<N> f(T (&)[N])
{
        S<N> foo;
        return foo;
}


int main()
{
    char buf[10];
    std::cout << f(buf).mysize << std::endl;
}

Anyway, you will need to return an object from f and access it's member by ., not by ::. But it's more probable that second variant will be slower, because first variant is fully compile-time, but in the second variant compiler may miss the optimization and don't optimize out the run-time creation of foo.

于 2013-01-22T15:05:49.830 に答える
0

プログラムには2つの間違いがあります。

  1. ::演算子を使用して、オブジェクトのメンバーにアクセスしています。operator .代わりに( "dot")を使用してください。
  2. 関数を宣言しf2()、定義せずに呼び出します(これにより、リンカーエラーが発生します)。

また、staticメンバー変数はクラスのすべてのインスタンス(Zこの場合)で共有されるため、アクセスするためにオブジェクトは必要ありません。

プログラムを修正する方法は次のとおりです。

#include <iostream>

struct Z
{
    static const int mysize = 10;
};

Z f2() { return Z(); }

int main()
{
    // Don't need an object to access a static variable...
    std::cout << Z::mysize << std::endl;

    // ...but if you really want to, do it this way...
    std::cout << f2().mysize << std::endl;
}
于 2013-01-22T14:50:33.093 に答える
-1

const int Z::mysize;クラス宣言の後に追加する必要があると思います。

于 2013-01-22T14:46:20.673 に答える