【发布时间】:2015-12-22 10:05:27
【问题描述】:
我得到了奇怪的代码,必须扩展它。但我决定创建一个模板,而不是多次复制粘贴。但是被一块可怕的石头抓住了。
这是一个示例代码:
template<typename T>
class anyClass {};
template<typename T>
class Outer : public anyClass<T>
{
public:
using value_t = T;
class Inner
{
virtual void foo(value_t);
};
};
class specializer : protected Outer::Inner
{
virtual void foo(int) override {}
}
我必须扩展 virtual void foo(value_t) 的专精。
例子:
class specializer : protected Outer::Inner
{
virtual void foo(int) override {}
virtual void foo(float) override {}
virtual void foo(string) override {}
virtual void foo(bar) override {}
// And so on...
}
问题 1:尽管 class specializer : protected Outer::Inner 遗漏了一个参数,为什么这个例子有效?
所有的重载几乎都是一样的。我已经创建了这个函数。
template<typename anyType>
void meow( anyType )
{
/***/
}
我的问题在这里:
virtual void foo(anytype value) //<< replace anytype with what?
{
meow<anytype>( value );
}
我需要 Outer::value_T 类型,但我不知道如何获取它。
问题 2:我如何通过调用foo 来使用meow?
请随时询问更多信息。
更新
我再次查看原始代码并意识到,我忽略了一个重要的 using/typedef。 工作代码如下:
class specializer : protected Outer<int, float, string, bar>::Inner //Yes a variadic-template
{
virtual void foo(int) override {}
virtual void foo(float) override {}
virtual void foo(string) override {}
virtual void foo(bar) override {}
// And so on...
}
所以问题 1 解决了。
【问题讨论】:
-
"class specializer : protected Outer::Inner" no such class Outer::Inner (第一个字母是大写的)
-
另外,也没有
Outer::inner这样的类,因为Outer是一个模板,而不是一个类。 -
@user3514538 谢谢,已解决。
-
@user2079303 我同意这一点。这就是我对示例代码编译并正常工作(原始形式)感到困惑的原因。
-
@Syrlia,它成功了!?在什么工具链上!? GCC 拒绝它,ideone.com/3RAEvF,这是理所当然的。
标签: c++ templates c++11 inner-classes virtual-functions