【发布时间】:2014-09-16 12:58:46
【问题描述】:
我正在尝试构建一个模板化的 C++ 函数,该函数接受一个指向内部类对象的指针作为其参数。这是所涉及的类结构的简化版本,类似于典型的链表或树类:
template <typename T>
struct Outer
{
struct Inner
{
T val;
Inner (T v) : val(v) { }
};
Inner* ptr;
Outer(T val)
{
ptr = new Inner(val);
}
};
我已将它们制成结构以排除任何访问控制问题并删除了一些无关的实例变量。考虑到这个类结构,这里有三个函数,前两个不是我想要的:
template <typename T>
void testOuter (const Outer<T>& obj)
{
cout << obj.ptr->val << endl;
}
void testInnerInt (const Outer<int>::Inner* p)
{
cout << p->val << endl;
}
template <typename T>
void testInnerTemplated (const typename Outer<T>::Inner* p)
{
cout << p->val << endl;
}
这第三个函数基本上是我想要的,在标题方面(当然,它旨在作为更大代码体中的辅助函数),但它不起作用。如果我编译并运行以下主函数:
int main()
{
Outer<int> foo(5);
cout << foo.ptr->val << endl;
testInnerInt(foo.ptr);
//testInnerTemplated(foo.ptr);
testOuter(foo);
}
它运行得很好(打印5 三次),但如果我取消注释调用testInnerTemplated 的行,我会收到一个编译器错误,说no matching function for call to ‘testInnerTemplated(Outer<int>::Inner*&)’(在g++ 4.9.1 中)。我猜这是模板查找或匹配的问题,但是我该如何告诉编译器如何解决呢?
【问题讨论】:
标签: c++ templates inner-classes