0

誰かがこの短いプログラムやその他のひどいプログラムに対してg ++が私に与えるコンパイルエラーを修正する方法を教えてもらえますか. 私は初心者です。ありがとう。私は自分が何をしているのかわからないので、それらのほとんどがそうであることを知っています.

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

int main (int argc, char* argv[])
{   
    struct RGB {
        float r;
        float g;
        float b;
    };

    int w = atoi(argv[1]);
    int h = atoi(argv[2]);

    vector<vector RGB > image;
    image.resize(w);
    for (int q = 0; q < w; ++q)
    image[q].resize(h);

    for (int i = 0; i < w; ++i){
        for (int j = 0; j < h; ++j){
            float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
            image[i][j].r = col;
            image[i][j].g = col;
            image[i][j].b = col;
        }
    }

    string filename = string(argv[3]) + ".ppm";
    ofstream file(filename);
    file << "P3" << endl;
    file << w << " " << h << endl;
    file << "255" << endl;
    for (int i = 0; i < h; ++i){
        for (int j = 0; j < w; ++j){
            float col = float (((i & 0x08) == 0) ^ ((j & 0x08) == 0));
            file << image[i][j].r*255 << " ";
            file << image[i][j].g*255 << " ";
            file << image[i][j].b*255 << " ";
        }
        file << endl;
    }
    file.close();

    return 0;
}

エラー:

hw1.cpp: In function ‘int main(int, char**)’:
hw1.cpp:24: error: template argument for ‘template<class _Alloc> class std::allocator’ uses local type ‘main(int, char**)::RGB’
hw1.cpp:24: error:   trying to instantiate ‘template<class _Alloc> class std::allocator’
hw1.cpp:24: error: template argument 2 is invalid
hw1.cpp:24: error: template argument 1 is invalid
hw1.cpp:24: error: template argument 2 is invalid
hw1.cpp:24: error: invalid type in declaration before ‘;’ token
hw1.cpp:25: error: request for member ‘resize’ in ‘image’, which is of non-class type ‘int’
hw1.cpp:27: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:32: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:33: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:34: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:39: error: no matching function for call to ‘std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::string&)’
/usr/include/c++/4.2.1/fstream:596: note: candidates are: std::basic_ofstream<_CharT, _Traits>::basic_ofstream(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/fstream:580: note:                 std::basic_ofstream<_CharT, _Traits>::basic_ofstream() [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.2.1/iosfwd:92: note:                 std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(const std::basic_ofstream<char, std::char_traits<char> >&)
hw1.cpp:46: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:47: error: invalid types ‘int[int]’ for array subscript
hw1.cpp:48: error: invalid types ‘int[int]’ for array subscript
4

3 に答える 3

2

vectorof vectors of sを宣言しようとしているようですRGB。ブラケットのペアがありません:

vector<vector<RGB> > image;

struct RGBまた、関数の外で宣言する必要がありますmain

于 2013-01-17T01:29:11.927 に答える
0

このコードには多くの問題があります。最初のいくつかの手順を説明します。うまくいけば、アイデアが得られることを願っています。

最初に表示されるコンパイラ エラーは次のとおりです。

15: error: ‘atoi’ was not declared in this scope

atoi はライブラリ関数なので、適切なライブラリを含める必要があります。「atoi ヘッダー」をグーグルで検索すると、これが cstdlib であることがわかります。上部に、次を追加します。

#include<cstdlib>

次に表示されるエラーは次のとおりです。

18: error: template argument 1 is invalid

18 行目は次のとおりです。

vector<vector RGB > image;

コレクションを宣言するための構文は次のとおりです。

collection_type<type_the_collection_is_of> varname;

ピクセルのベクトルが必要か、ピクセルのベクトルのベクトルが必要かによって、次のいずれかになります。

vector<RGB> image;
vector< vector<RGB> > image;

原則として、コンパイラーが変数宣言について混乱すると、後でその変数が使用されたときに起こることについても混乱します。それでは、再コンパイルしましょう。

おっと、宣言についてはまだ不満です: 21: エラー: 'template class std::allocator' のテンプレート引数はローカル型 'main(int, char**)::RGB' を使用しています</p>

「ご当地タイプ」。変な言い方ですね。おー。構造体は関数で定義されます。それが許されているとは知りませんでした。しかし、私たちにとってはうまく機能していないようですので、外に移動してもう一度コンパイルしましょう...

これがすべてではありませんが、この種のものをデバッグする方法を感じ取っていただければ幸いです。

于 2013-01-17T01:40:20.717 に答える
0
  1. struct RGBメインから移動します。ローカルで宣言された型をテンプレート化することはできません。

  2. ベクトルのベクトルは次のように宣言する必要があります。

    vector< vector<RGB> >
    
  3. ofstreamstringコンストラクターはオブジェクトをパラメーターとして取りません。代わりにこれを使用してください:

    ofstream file(filename.c_str());
    
于 2013-01-17T01:34:44.267 に答える