Dan Smithers wrote:
> What constitutes a constant-expression? I know that it is something
> that can be determined at compile time.
>
> I am trying to use template code and keep getting compiler errors
> "error: cannot appear in a constant-expression"
>
> template <int s>
> class CFoo
> {
> private:
> int m_val[s];
> };
>
> struct SParams
> {
> const int m_sz;
> SParams(int sz) : m_sz(sz) {;}
> };
>
> int main(int argc, char *argv[])
> {
> CFoo<2> foo;
>
> const int sz(2);
> CFoo<sz> foo2;
>
> int sz2(3);
> CFoo<sz2> foo3;
>
> const SParams params(4);
> CFoo<params.m_sz> foo4;
> }
>
> When I compile this code I get the following output.
>
> dwhs1@[EMAIL PROTECTED]
g++ -o template template.cpp
> template.cpp:22: error: 'sz2' cannot appear in a constant-expression
> template.cpp:22: error: template argument 1 is invalid
> template.cpp:22: error: invalid type in declaration before ';' token
> template.cpp: In function 'int main(int, char**)':
> template.cpp:25: error: 'params' cannot appear in a
> constant-expression template.cpp:25: error: `.' cannot appear in a
> constant-expression template.cpp:25: error: template argument 1 is
> invalid
> template.cpp:25: error: invalid type in declaration before ';' token
>
> I understand that in line 22 I am using a local variable that is not
> const, but on line 25 there is a const member of a const structure.
>
> What's going on here?
I think a function call (and you have a constructor defined in your
'SParams' struct) interferes with the "const-ness" of 'params' object.
Since the initialisation requires a constructor call (never mind that
it actually can be optimized), the object is considered initialised at
run-time, and therefore cannot be part of the compile-time const expr.
That's my take on it, I didn't actually verify with the Standard.
V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask


|