منذ فتره كنت قد صنعت فئه تتعامل مع النصوص واليوم قمت بإضافة مجموعة دوال جديده لها خاصه بدمج النصوص و التصريح الخاص بهم كالتالى:
char* Concat(const char* s1, const char* s2); char* Concat(const char** src, int size); char* Concat(const char** src, int size, int start_idx); char* Concat(const char** src, int size, int start_idx, int count); char* Concat(const char** src, int size, const char* delimit); char* Concat(const char** src, int size, const char* delimit, int start_idx); char* Concat(const char** src, int size, int start_idx, int count, const char* delimit);
و بدون اسماء المعاملات لتسهيل قرائتهم
char* Concat(const char*, const char*); char* Concat(const char**, int); char* Concat(const char**, int, int); char* Concat(const char**, int, int, int); char* Concat(const char**, int, const char*); char* Concat(const char**, int, const char*, int); char* Concat(const char**, int, int, int, const char*);
2Cجميع الدوال ماعدا الدالتين الأولى و الأخيره تم تعريفهم inline داخل الـ header file و يقوموا بإستدعاء الداله الأخيره حيث انها هى الداله الرئيسيه.
قمت بكتابة الكود التالى داخل ملف كود لإختبار الدوال:
#include <iostream>
#include "strlib.h" // my class nae is StrLib
using namespace std;
void main()
{
const int ArraySize = 4;
char* ppstr[] = {"My", "name", "is", "Muhammad"};
char* retVal = StrLib::Concat(ppstr, ArraySize, " ");
cout << "Before Concating\n";
for(int i=0; i<ArraySize; i++)
cout << "Element " << i+1 << ppstr << endl;
cout << "After Concating with space as delimit character\n";
cout << retVal << endl;
}و لكن المترجم يعترض عن السطر التالى
char* retVal = StrLib::Concat(ppstr, ArraySize, " ");
رسالة الخطأ تقول
error C2665: 'Concat' : none of the 7 overloads could convert all the argument types
و داخل شاشة الـ output يظهر تفصيل اكثر عن الخطأ و هو
error C2665: 'Concat' : none of the 7 overloads could convert all the argument types could be 'char *Concat(const char **,int,int)' or 'char *Concat(const char **,int,const char *)' while trying to match the argument list '(char *[4], const int, const char [2])'
و بعد البحث وجدت هذا الرابط داخل الـ MSDN ويعرض سبب المشكله و يوجد كود بسيط يظهر سبب الخطأ و كيفية حله
// C2665.cpp
void func(short, char*){}
void func(char*, char*){}
int main() {
func(0, 1); // C2665
func((short)0, (char*)1); // OK
}مالا افهمه هو انه يوجد دالتين فقط بإسم Concat يأخذوا نفس العدد من المعاملات بإختلاف انواعهم و هم
char* Concat(const char**, int, int); char* Concat(const char**, int, const char*);
الفرق بين الإثنين هو المعامل الثالث الأولى هى التى استدعيها،
صحيح ان كلاهما قد يقبل رقم و لكنى بداخل الكود قمت بتحديد ان القيمه المدخله هى مؤشر لنص (النص عبارة عن مسافة فارغه).
اذا كنت سأقوم بتمرير قيمة المعامل الثالث م 9 تحديد نوعه (عمل cast له لـ const char*) - و قد جربت و لم تنفع - فما فائدة الـ type checking اذا كنت سأحدد نوع المعامل الذى سأمرره.
حاولت معها و لم اجد لها حل، أرجو ان كان لدى احدكم حل لها ان يضففه.
و الله ولى التوفيق

