سؤال

لدي مجموعة كبيرة كبيرة رمز قاعدة تشمل اثنين من أهم مساحات:المحرك و التطبيق.

المحرك يعرف vector3 الفئة typedef آخر vector3 الصف ، مع المساواة بين مشغلي التي تجلس في المحرك مساحة لا في vector3 الدرجة.لقد تم إضافة فئة إلى التطبيق الذي كان أيضا المساواة بين المشغلين في مساحة التطبيق.

عندما حاولت تجميع, لا علاقة لها ولكن قريبة vector3 مقارنات فاشلة لأنها لم تجد المناسب المساواة المشغل.توقعت لقد تسبب الصراع حتى حركت المساواة بين المشغلين في الدرجة المضافة ، ترجمة نجحت.

// engine.h
namespace Engine
{
    class Vector3Impl { ... };
    typedef Vector3Impl Vector3;
    bool operator==(Vector3 const &lhs, Vector3 const &rhs) { ... }
}


// myfile.cpp
#include "engine.h"

namespace application
{
    class MyClass { ... };
    bool operator==(MyClass const &lhs, MyClass const &rhs) { ... }

    void myFunc(...)
    {
        if ( myClassA == myClassB ) { ... } // builds
    }

    void anotherFunc(...)
    {
        Engine::Vector3 a, b;
        ...
        if ( a == b ) { ... } // fails
    }
}

ولكن بعد التفكير في ذلك لا أستطيع أن أرى لماذا تجميع فشلت.لا توجد الضمني التحويلات من vector3s فصلي أو العكس بالعكس ، والحجة التي تعتمد على البحث يجب أن يكون سحب في المساواة بين المشغل من المحرك مساحة ومطابقة ذلك.

لقد حاولت استنساخ هذا الخلل في عينة C++ المشروع ولكن أن يرفض كسر.يجب أن يكون هناك شيء كبير كبير قاعدة القانون التي تسبب هذه المشكلة, ولكن أنا لست متأكدا من أين تبدأ البحث.شيء مثل عكس المارقة "باستخدام محرك"?أي شخص لديه أي أفكار ؟

هل كانت مفيدة؟

المحلول

C++ القياسية ، 3.4.4.2 تعلن:

لكل نوع الوسيطة تي في استدعاء دالة ، هناك مجموعة من صفر أو أكثر المرتبطة مساحات ومجموعة من الصفر أو أكثر المرتبطة الطبقات إلى النظر فيها.مجموعات من مساحات الأسماء والطبقات مصممة بالكامل من قبل أنواع من وظيفة الحجج (و مساحة من أي قالب قالب الحجة). الرموز المميزة ل Typedef الأسماء استخدام الإعلانات تستخدم لتحديد أنواع لا تساهم هذه المجموعة.

ADL لا يعمل مع الرموز المميزة ل typedef هو.

نصائح أخرى

وركضت مرة واحدة في نفس المشكلة مع مترجم التي لم يكن لديك حجة بحث تابع (كونيغ بحث - بفضلigor) (VC6 على ما أظن). وهذا يعني أنه عندما يرى المشغل، يبدو تماما في مساحات أرفق.

وهكذا يمكن لك أن تقول لنا ما المترجم الذي تستخدمه؟

ونقل إلى مجمع آخر حلها.

ومريح جدا في الواقع.

bool operator==(Vector3 const &lhs, Vector3 const &rhs) { ... }

ويجب أن يكون التعريف الكنسي عامل المساواة تعريف على فئة وسيطة واحدة، وهي يمين. على الطرف الأيسر هو هذا. لا أعرف إذا كان هذا سيكون حلا لمشكلتك بالرغم من ذلك.

وهذا ما أود أن أكتب:

والطبقة Vector3 {  مشغل منطقي == (CONST Vector3 ويمين) CONST {...} }؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top