【发布时间】:2010-01-28 07:05:05
【问题描述】:
我正在尝试执行以下操作:从函数中本地定义的类中获取成员函数的地址。
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,其形式为“setupCallback(void (SomeUnitTest::someTest()::NestedClass::SomeFunction::*), etc) 尝试#3 就是这样诞生的。
我真的找不到很多关于在函数中定义的类的信息,有谁知道正确的语法,也许有讨论这个主题的资源?
好吧,看来这已经解决了,正如两位发帖者所指出的,本地类没有链接,它不能工作。现在知道了这一点,我找到了这篇讨论这个问题的文章,对于遇到这个问题并偶然发现这个问题的任何人:http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=420
编辑:
setupCallback() 的说明,具有更常规类的工作示例
编辑#2:
更新了措辞,将“嵌套”更改为“本地”。为 setupCallback 添加了更多详细信息。
编辑#3:添加了更多信息的链接。感谢大家。
【问题讨论】:
-
我很确定你一开始就不能在 C++ 的函数中定义一个类。
-
@Max S:不,你可以(毕竟
class和struct等价)。顺便说一句,“嵌套类”通常是指另一个类中的一个类。 -
@Max. S:这些被称为本地类,并在标准中明确提及——尽管与非本地类相比,它们有些残缺。
-
你需要告诉我们更多关于
setupCalback函数的信息。它是如何声明的?它期望什么参数类型?您的代码中的问题与地址本身或本地类有关。问题是setupCallbak调用中的参数与参数不兼容。这就是编译器实际上试图告诉你的。
标签: c++ member-function-pointers local-class