Reputation: 753
The code compiles, and runs as expected using Visual Studio. I understand that never guarantees it will compile/run elsewhere, but I don't understand why in this instance. Perhaps someone can help clarify? The g++ compiler gives me errors at line 45 where the vector of vectors of type RGB are declared:
#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;
}
Here's the full list of errors that pop up in 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
Upvotes: 0
Views: 921
Reputation: 31445
I see two errors:
vector< vector<RGB> > rgb(h, vector<RGB>(w));
C++03 does not allow this for a type that is "local" to your function so move the definition out of main().
Also the open
function does not take std::string
as an argument but const char *. So change
ppmfile.open (filename);
to
ppmfile.open( filename.c_str() );
Upvotes: 2
Reputation: 96291
In C++03 (which is almost certainly what you're getting with g++ 4.4.3) the problem is that local types and types with internal linkage can't be used as template parameters. In this case your RGB
class is defined within main
and isn't eligible to be used as a parameter to vector
.
The restrictions were loosened in C++11 but I can't recall if (function) local types are still forbidden. Visual studio may be using C++11 rules while g++ is not.
Upvotes: 2
Reputation: 1569
As I remember C++03 forbids using types with internal linkage in templates.
You should pull the RGB class from the main() function
Upvotes: 4