www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - inout method is not callable using a const object

reply Jonathan Crapuchettes <jcrapuchettes gmail.com> writes:
Can someone help me understand how to correct this error?

Error: inout method ...ValidSparseDataStore.opIndex is not callable using 
a const object

The specific method is defined as:

struct ValidSparseDataStore
{
    inout(DataT*) opIndex(const Address addr) inout
    {
        if (auto node = findNode(addr))
            return cast(inout)&(node.data);

        return null;
    }

    private ValidSparseNode* findNode(const Address ids) const
    {
        ...
    }
}

Thank you,
JC
Sep 06 2013
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 09/06/2013 01:14 PM, Jonathan Crapuchettes wrote:

 Can someone help me understand how to correct this error?

 Error: inout method ...ValidSparseDataStore.opIndex is not callable using
 a const object
That error is about opIndex but we don't see any code that makes that call.
 The specific method is defined as:

 struct ValidSparseDataStore
 {
      inout(DataT*) opIndex(const Address addr) inout
      {
          if (auto node = findNode(addr))
              return cast(inout)&(node.data);

          return null;
      }

      private ValidSparseNode* findNode(const Address ids) const
      {
          ...
      }
 }

 Thank you,
 JC
I can reproduce it with this code: struct S { void foo(int) inout {} } void main() { const s = S(); s.foo(42); // <-- works s.foo(); // <-- ERROR } Error: inout method deneme.S.foo is not callable using a const object I can't know whether this matches your case but the compiler should error about not finding a matching foo() overload instead of bringing the inout into the discussion. Ali
Sep 06 2013
next sibling parent reply Jonathan Crapuchettes <jcrapuchettes gmail.com> writes:
On Fri, 06 Sep 2013 13:27:20 -0700, Ali Çehreli wrote:

 On 09/06/2013 01:14 PM, Jonathan Crapuchettes wrote:
 
  > Can someone help me understand how to correct this error?
  >
  > Error: inout method ...ValidSparseDataStore.opIndex is not callable
  > using a const object
 
 That error is about opIndex but we don't see any code that makes that
 call.
 
  > The specific method is defined as:
  >
  > struct ValidSparseDataStore {
  >      inout(DataT*) opIndex(const Address addr) inout {
  >          if (auto node = findNode(addr))
  >              return cast(inout)&(node.data);
  >
  >          return null;
  >      }
  >
  >      private ValidSparseNode* findNode(const Address ids) const {
  >          ...
  >      }
  > }
  >
  > Thank you,
  > JC
 
 I can reproduce it with this code:
 
 struct S {
      void foo(int) inout {}
 }
 
 void main()
 {
      const s = S();
      s.foo(42);     // <-- works s.foo();       // <-- ERROR
 }
 
 Error: inout method deneme.S.foo is not callable using a const object
 
 I can't know whether this matches your case but the compiler should
 error about not finding a matching foo() overload instead of bringing
 the inout into the discussion.
 
 Ali
Sorry for not including the call site. Here is an example of the call: void main() { auto store = ...; //add items to the storage const cStore = store; auto dp = cStore[16057]; //<-- ERROR } I can try to minimize the code to a working example if needed. Thank you, JC
Sep 06 2013
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
I think it is the same issue then.

On 09/06/2013 02:00 PM, Jonathan Crapuchettes wrote:

   >      inout(DataT*) opIndex(const Address addr) inout {
Unless Address is an alias of int, there is no matching opIndex overload for the following call:
 	auto dp = cStore[16057];	//<-- ERROR
Ali
Sep 06 2013
parent Jonathan Crapuchettes <jcrapuchettes gmail.com> writes:
On Fri, 06 Sep 2013 14:08:19 -0700, Ali Çehreli wrote:

 I think it is the same issue then.
 
 On 09/06/2013 02:00 PM, Jonathan Crapuchettes wrote:
 
  >>   >      inout(DataT*) opIndex(const Address addr) inout {
 
 Unless Address is an alias of int, there is no matching opIndex overload
 for the following call:
 
  > 	auto dp = cStore[16057];	//<-- ERROR
 
 Ali
Thank you for your help. For some reason, no one else in the office noticed that problem. In my code Address was something like TypeTuple! (int, char) and I was trying to call opIndex(int, int). Thank you again.
Sep 06 2013
prev sibling parent =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 09/06/2013 01:27 PM, Ali Çehreli wrote:

 the compiler should
 error about not finding a matching foo() overload instead of bringing
 the inout into the discussion.
http://d.puremagic.com/issues/show_bug.cgi?id=10982 Ali
Sep 06 2013