www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Error: cannot call public/export function someFunction from invariant

reply "simendsjo" <simendsjo gmail.com> writes:
See topic. Why is this not allowed? The function in question is 
not virtual.

struct S {
     void someFunction() const {}
     const invariant() { someFunction(); }
}
void main() {
     S s;
}
Oct 18 2013
parent reply "bearophile" <bearophileHUGS lycos.com> writes:
simendsjo:

 See topic. Why is this not allowed? The function in question is 
 not virtual.

 struct S {
     void someFunction() const {}
     const invariant() { someFunction(); }
 }
 void main() {
     S s;
 }
It being not virtual is not important. In what cases is invariant() called, simendsjo? I sense an infinite loop. Bye, bearophile
Oct 18 2013
next sibling parent reply Jonathan M Davis <jmdavisProg gmx.com> writes:
On Friday, October 18, 2013 11:04:25 bearophile wrote:
 simendsjo:
 See topic. Why is this not allowed? The function in question is
 not virtual.
 
 struct S {
 
     void someFunction() const {}
     const invariant() { someFunction(); }
 
 }
 void main() {
 
     S s;
 
 }
It being not virtual is not important. In what cases is invariant() called, simendsjo? I sense an infinite loop.
Yeah, it's probably because someFunction calls the invariant before and after it's called. If you want to call a member function from an invariant, it should be static, or it should be a free function. - Jonathan M Davis
Oct 18 2013
parent "simendsjo" <simendsjo gmail.com> writes:
On Friday, 18 October 2013 at 09:08:53 UTC, Jonathan M Davis 
wrote:
 On Friday, October 18, 2013 11:04:25 bearophile wrote:
 simendsjo:
 See topic. Why is this not allowed? The function in question 
 is
 not virtual.
 
 struct S {
 
     void someFunction() const {}
     const invariant() { someFunction(); }
 
 }
 void main() {
 
     S s;
 
 }
It being not virtual is not important. In what cases is invariant() called, simendsjo? I sense an infinite loop.
Yeah, it's probably because someFunction calls the invariant before and after it's called. If you want to call a member function from an invariant, it should be static, or it should be a free function.
Ah, good point - stupid me :) I'll rather move some checking to pre/post contracts.
Oct 18 2013
prev sibling parent Andrej Mitrovic <andrej.mitrovich gmail.com> writes:
On 10/18/13, Jonathan M Davis <jmdavisProg gmx.com> wrote:
 If you want to call a member function from an invariant, it
 should be static, or it should be a free function.
I can also be private, the diagnostic is pretty clear about that. :)
Oct 18 2013