نمایش نتایج 1 تا 13 از 13

نام تاپیک: Linker Error - LNK 2019

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #8

    نقل قول: Linker Error - LNK 2019

    در مورد template ها:
    در استاندارد ++C نحوه parse شدن template ها توسط کامپایلر به صورت دوفازی است (two-phase name lookup). فاز اول POD Point Of Definition و فاز دوم POI Point Of Instantiation.

    وقتی که کامپایلر به یک template برخورد میکند در فاز POD قرار داره. در این مرحله کامپایلر همه متدها، متغیر ها و نوعهای Non Dependant را کامپایل میکند و Dependant ها را به POI موکول میکند. به طور خیلی ساده Dependant به(member)عضوها و یا (type)نوع هایی گفته میشه که به پارامتر template بستگی دارند. البته استاندارد ++C در این مورد کاملا اکید است و مشخصات کامل dependant ها را به همراه مثال های مربوطه توضیح داده.
    زمانی که کامپایلر به یک (instantiation)نمونه سازی برخورد میکند برای مثال

    class1<int> a;

    در فاز POI قرار داره. در اینجا کامپایلر میفهمد که که به جای پارامتر template دقیقا چه چیزی باید قرار دهد. (در مثال ما int). در این فاز کامپایلر عضوهای مورد نظر را ساخته و در translation unit جاری قرار میدهد. لازم به یاد آوریست که با پارامترهای مختلف کلاسها و متدهایی که به صورت template هستند معنای مختلفی دارند و به ازای هر پارامتر متد و یا نوع جدیدی ساخته میشود.

    اما در اینجا خوبه که این مسئله رو عنوان کنم که کامپایلر ++VC که بیشتر ماها ازش استفاده میکنیم، برخلاف کامپایلرهای مطرح دیگر، در این مورد یعنی two-phase name lookup به همراه بعضی موارد دیگر مثل export template و exception specifications از استاندارد پیروی نمیکند. طرز برخورد ++VC با template ها مثل طرز برخورد آن با ماکروهاست یعنی فقط فاز POI را دارد و فقط وقتی به یک Instantiation برخورد کرد عضوهای مورد نظر را ساخته و در obj مربوط به translation unit جاری قرار میدهد. اگر استاندارد ++C مثل ++VC با template ها برخورد کرده بود و اونها را به این صورت مثل ماکروها میشناخت اونوقت template های ++C تو بحث OO قرار نمیگرفتند و سلاح خوبی برای طرفدارهای #C میشد که generic ما فلانه و template های شما...
    آخرین ویرایش به وسیله C++‎Lover : جمعه 27 دی 1387 در 20:55 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •