2

何が間違っているのかわかりません。基本クラス メンバへのポインタからのテンプレート推論の問題 - &DerivedClass::BaseClassMemeber。

完全な例:

#include <vcl.h>
#include <tchar.h>

struct Base
{
   int BaseClassMember;
};

struct Derived : public Base
{
};

template<class T1, class T2>
void Test(T1& Param1, T2 T1::* Param2)
{
}

int _tmain()
{
   Derived inst;
   // Compile error E2285 Could not find a match for 'Test<T1,T2>(B,int A::*) - BCC32
   // Error 1 error C2782: 'void Test(T1 &,T2 T1::* )' : template parameter 'T1' is   ambiguous - MS VS8
   Test(inst, &Derived::BaseClassMember);

   // Works great
   Test<Derived>(inst, &Derived::BaseClassMember);
   return 0;
 }

いくつかの回避策を見つけることができます。たとえば、もう 1 つのテンプレート パラメーター、static_cast、暗黙的な部分特殊化 (Test) による追加のテスト関数のオーバーロードです。

しかし、コンパイラが &DerivedClass::BaseClassMemeber で明示的に指定されたクラスを使用できない理由に興味があります。それが問題です。そして、問題に対するより洗練された解決策がある場合は、歓迎します。

4

1 に答える 1

2

&Derived::BaseClassMemberありint Base::*ませんint Derived::*。標準を引用する:

単項演算子の結果は、&そのオペランドへのポインターです。オペランドは、左辺値または修飾 IDでなければなりません。オペランドが type のクラスの非静的メンバーを指定する修飾 ID である場合、結果のは「type のクラスのメンバーへのポインター」であり、 を指定する prvalueです。[…スキップ…] [例: mCTCTC::m

struct A { int i; };
struct B : A { };
... &B::i ...             // has type int A::*i

— 最後の例]

int Derived::*この型が必要な場合は、値をキャストする必要があります。

于 2014-02-28T06:54:09.097 に答える