私は次のことを行おうとしています。関数内でローカルに定義されたクラスからメンバー関数のアドレスを取得します。
class ConnectionBase
{
};
template class<EventType, SinkType>
class ConnectionImpl : public ConnectionBase
{
public:
typedef void (SinkType::*EventCallback)(EventType const&);
};
template<class EventType>
class Source
{
template <class SinkType>
boost::shared_ptr<ConnectionBase> setupCallback(typename ConnectionImpl<EventType, SinkType>::EventCallback func, SinkType* sink)
{
// do the actual connecting.
}
};
class SomeClass
{
public:
void someFunction(int const& event){}
}
class SomeUnitTest
{
public:
void someTest()
{
class NestedClass
{
public:
void someFunction(int const& event){}
};
NestedClass nc;
//Try#1 - This does not work
setupCallback<int, NestedClass>(&NestedClass::someFunction, &nc);
//Try #2 - This also does not work
setupCallback<int, NestedClass>(&SomeUnitTest::someTest::NestedClass::someFunction, &nc);
//Try #3 - Following the GCC error output, I tried this
setupCallback<int, NestedClass>(&SomeUnitTest::someTest()::NestedClass::someFunction, &nc);
SomeClass sc;
//This works fine, as expected
setupCallback<int, SomeClass>(&SomeClass::someFunction, &sc);
}
};
#2と#3を試してみてください。GCCを完全に混乱させます。私が何をしようとしているのかわかりません。試行#1は、「setupCallback(void(SomeUnitTest :: someTest():: NestedClass :: SomeFunction :: *)など)の形式のsetupCallbackが存在しないことを示す、より役立つエラーメッセージを生成します。これが試行#3の誕生です。
関数内で定義されたクラスに関する多くの情報を実際に見つけることができません。誰かがこれの正しい構文を知っていますか、そしておそらくこのトピックを議論するリソースを持っていますか?
両方のポスターが指摘しているように、これは解決されたようです。ローカルクラスにはリンクがなく、機能しません。これを知った今、この問題に遭遇し、この質問に遭遇した他の人のために、これについて説明しているこの記事を見つけました:http: //www.informit.com/guides/content.aspx? g=cplusplus&seqNum=420
編集:setupCallback()の明確化、より通常のクラスでの作業例
編集#2:「ネストされた」を「ローカル」に変更するように文言を更新しました。setupCallbackの詳細を追加しました。
編集#3:詳細情報へのリンクを追加しました。みんな、ありがとう。