const не применяется в определении функции-члена [duplicate]

    **Use like this in Your Activity**

    btnsub.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub

            //Initialize soap request + add parameters
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);        

            //Use this to add parameters


            request.addProperty("pincode",txtpincode.getText().toString());
            request.addProperty("bg",bloodgroup.getSelectedItem().toString());

            //Declare the version of the SOAP request
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

            envelope.setOutputSoapObject(request);
            envelope.dotNet = true;

            try {

                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

                //this is the actual part that will call the webservice
                androidHttpTransport.call(SOAP_ACTION1, envelope);

                // Get the SoapResult from the envelope body.
                SoapObject result = (SoapObject)envelope.getResponse();
                Log.e("result data", "data"+result);
                 SoapObject root = (SoapObject) result.getProperty(0);
             //   SoapObject s_deals = (SoapObject) root.getProperty(0);
                //SoapObject s_deals_1 = (SoapObject) s_deals.getProperty(0);
                   //                    


                System.out.println("********Count : "+  root.getPropertyCount());

                value=new ArrayList<Detailinfo>();

                for (int i = 0; i < root.getPropertyCount(); i++) 
                {
                    SoapObject s_deals = (SoapObject) root.getProperty(i);
                    Detailinfo info=new Detailinfo();

                    info.setFirstName(     s_deals.getProperty("Firstname").toString());
                    info.setLastName( s_deals.getProperty("Lastname").toString());
                    info.setDOB( s_deals.getProperty("DOB").toString());
                    info.setGender( s_deals.getProperty("Gender").toString());
                    info.setAddress( s_deals.getProperty("Address").toString());
                    info.setCity( s_deals.getProperty("City").toString());
                    info.setState( s_deals.getProperty("State").toString());
                    info.setPinecode( s_deals.getProperty("Pinecode").toString());
                    info.setMobile( s_deals.getProperty("Mobile").toString());
                    info.setEmail( s_deals.getProperty("Email").toString());
                    info.setBloodgroup( s_deals.getProperty("Bloodgroup").toString());
                    info.setAdddate( s_deals.getProperty("Adddate").toString());
                    info.setWaight(s_deals.getProperty("waight").toString());
                    value.add(info);

                }    


            } catch (Exception e) {
                e.printStackTrace();
            }
            Intent inten=new Intent(getApplicationContext(),ComposeMail.class);
            //intent.putParcelableArrayListExtra("valuesList", value);

            startActivity(inten);



                }
            }).start();
        }
    });
14
задан detunized 20 March 2014 в 18:55
поделиться

2 ответа

Это поведение определено стандартом, и, насколько я могу судить, gcc здесь корректно, если мы посмотрим на проект C ++ standard section 13.1 Перегружаемые объявления paragraph 3 говорит:

[...] - объявления параметров, которые отличаются только наличием или отсутствием константы и / или летучих, эквивалентны. То есть, константные и неустойчивые типы-спецификаторы для каждого типа параметра игнорируются при определении того, какая функция объявляется, определяется или вызывается.

и предоставляет этот пример:

[ Example:
    typedef const int cInt;

    int f (int);
    int f (const int); // redeclaration of f(int)
    int f (int) { /* ... */ } // definition of f(int)
    int f (cInt) { /* ... */ } // error: redefinition of f(int)
—end example ]

и некоторые подробности, поясняющие, что это относится только к внешним cv квалификаторам ( ] emphasis mine ):

Только конструкторы типа const и volatile на самом внешнем уровне спецификации типа параметра игнорируются таким образом; const и volatile, специфицированные по типу спецификаций параметров, являются значительными и могут использоваться для различения перегруженных деклараций функций.123 В частности, для любого типа T, «указатель на T», «указатель на const T» и «указатель на volatile T "считаются отдельными типами параметров, как« ссылка на T »,« ссылка на const T »и« ссылка на volatile T. »

, и насколько я могу судить это относится и к функциям шаблона в классах шаблонов, а также из раздела 14.8 Специализация шаблонов функций , в частности 14.8.3 Разрешение перегрузки , которое гласит:

[...] Полный набор функций-кандидатов включает в себя все синтезированные объявления и все перегруженные функции без шаблона с тем же именем. Синтезированные объявления обрабатываются как любые другие функции в остальной части разрешения перегрузки, за исключением случаев, явно указанных в 13.3.3.144

11
ответ дан Shafik Yaghmour 31 August 2018 в 21:09
поделиться

Это ошибка, потому что она предотвращает использование легитимного кода:

/* API declaration */
void f(int);


/* Implementation */
void f(const int x) /* my business: x is my local var and I want it const */
{
}

Не могу поверить, что кто-то будет кодировать их путь, чтобы диагностировать это как проблему.

Кстати, GCC, который не жалуется на это, имел предупреждение об этой ситуации. Возможно, он все еще делает:

void f(int func_ptr(void));

void f(int (*func_ptr)(void))
{
}

Это чисто стилистическая несогласованность, которая не служит цели.

2
ответ дан Kaz 31 August 2018 в 21:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: