0

コードはコンパイルされ、Visual Studio を使用して期待どおりに実行されます。他の場所でコンパイル/実行されることを保証するものではないことは理解していますが、この場合の理由はわかりません。おそらく誰かが明確にするのを助けることができますか?g++ コンパイラは、RGB 型のベクトルのベクトルが宣言されている 45 行目でエラーを返します。

#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

/*  The following color method uses the provided formula to determine
the float value of each (i,j) coordinate passed as parameters.  */

float color (int i, int j)
{
    float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));

    return col;
}

int main()
{
    // The provided RGB object that stores each rgb value:
    struct RGB
    {
        float r;
        float g;
        float b;
    };

    int w;
    int h;
    string filename;
    float c; // to store the result from the color method.

    cin >> w >> h >> filename;

    // A vector of vectors to represent the 2D array:
    vector< vector<RGB> > rgb(h, vector<RGB>(w));

    for (int i = 0; i < h; i++)
        for (int j = 0; j < w; j++)
        {
            c = color(i, j);
            rgb[i][j].r = c;
            rgb[i][j].g = c;
            rgb[i][j].b = c;
        }

        ofstream ppmfile;
        ppmfile.open (filename);
        ppmfile << "P3\n" << w << " " << h << endl;
        ppmfile << "255\n";

        for (int i = 0; i < h; i++)
        {
            // The following loop uses integer multiplication to output to the ppm
            // file the rgb values converted to integers on the 0-255 scale.
            for (int j = 0; j < w; j++)
            {
                ppmfile << rgb[i][j].r * 255 << " ";
                ppmfile << rgb[i][j].g * 255 << " ";
                ppmfile << rgb[i][j].b * 255;
                if (j != (w-1))
                    ppmfile << " ";
            }
            ppmfile << endl;
        }


        return 0;
}

g++ でポップアップするエラーの完全なリストは次のとおりです。

hw1.cxx: In function 'int main()':
hw1.cxx:45: error: template argument for 'template<class _Alloc> class std::allocator' uses local type 'main()::RGB'
hw1.cxx:45: error:   trying to instantiate 'template<class _Alloc> class std::allocator'
hw1.cxx:45: error: template argument 2 is invalid
hw1.cxx:45: error: template argument 1 is invalid
hw1.cxx:45: error: template argument 2 is invalid
hw1.cxx:45: error: invalid type in declaration before '(' token
hw1.cxx:45: error: template argument for 'template<class _Alloc> class std::allocator' uses local type 'main()::RGB'
hw1.cxx:45: error:   trying to instantiate 'template<class _Alloc> class std::allocator'
hw1.cxx:45: error: template argument 2 is invalid
hw1.cxx:45: error: initializer expression list treated as compound expression
hw1.cxx:51: error: invalid types 'int[int]' for array subscript
hw1.cxx:52: error: invalid types 'int[int]' for array subscript
hw1.cxx:53: error: invalid types 'int[int]' for array subscript
hw1.cxx:57: error: no matching function for call to 'std::basic_ofstream<char, std::char_traits<char> >::open(std::string&)'
/usr/local/gcc443/lib/gcc/i386-pc-solaris2.10/4.4.3/../../../../include/c++/4.4.3/fstream:696: note: candidates are: void std::basic_ofstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
hw1.cxx:67: error: invalid types 'int[int]' for array subscript
hw1.cxx:68: error: invalid types 'int[int]' for array subscript
hw1.cxx:69: error: invalid types 'int[int]' for array subscript
4

3 に答える 3

4

私が覚えているように、C++03 では、テンプレートで内部リンケージを持つ型を使用することは禁止されています。

main() 関数から RGB クラスをプルする必要があります

于 2013-01-16T16:52:13.557 に答える
2

C++03 (これはほぼ確実に g++ 4.4.3 で得られるものです) では、ローカル型と内部リンケージを持つ型をテンプレート パラメーターとして使用できないという問題があります。この場合、RGBクラスは 内で定義されmainており、 へのパラメーターとして使用する資格がありませんvector

制限は C++11 で緩和されましたが、(関数) ローカル型がまだ禁止されているかどうかは思い出せません。Visual Studio は C++11 ルールを使用している可能性がありますが、g++ は使用していません。

于 2013-01-16T16:52:27.797 に答える
2

次の 2 つのエラーが表示されます。

vector< vector<RGB> > rgb(h, vector<RGB>(w));

C++03 では、関数に対して「ローカル」な型に対してこれを許可していないため、定義を main() の外に移動します。

また、このopen関数は引数として取りませんstd::stringが、const char *. だから変える

ppmfile.open (filename);

ppmfile.open( filename.c_str() );
于 2013-01-16T17:02:26.903 に答える