如何在模板中使用嵌套的 typedef?
How to use a nested typedef in a template?
我想从模板化类型 Base
派生类型 Test
,我专门研究派生类型(即 Base<Test>
)。
在模板化类型中,我想使用在派生类型(模板参数)中定义的 typedef。
但是,我得到这个编译错误:
error C2039: 'X' : is not a member of 'Test'
这是代码片段:
template <typename T>
class Base
{
protected:
void func(typename T::X x) {}
};
class Test : public Base<Test>
{
public:
typedef int X;
};
这可行吗?如果可行,我需要做什么修复?
(我看到了针对此类问题的几个答案,但看起来我的情况并没有通过前缀类型名称来解决 - 它是否与从专门用于派生类型的模板派生有关?)
我不确定这种行为,也许有人可以澄清一下。但据我所知,在你做 : public Base<Test>
的那一刻,类型名称 X 不存在(因为在下面声明)。
如果您在进行继承之前创建包装器 class,则在您进行继承时类型将存在,并且模板实例化将起作用。
这是用 VC++ 2013
编译的
template <typename T>
class Base
{
protected:
void func(typename T::X x) {}
};
class TestWrapper
{
public:
typedef int X; //Declared, now it exists for the compiler
};
class Test
:public Base<TestWrapper> //Compiles correctly
{
};
您有一个无法通过前向声明解决的循环问题。但这会起作用,尽管(我怀疑)没有像你想要的那样强烈定义。
template <typename T>
class Base
{
protected:
template<typename Y>
void func(Y x) {}
};
class Test : public Base<Test>
{
public:
typedef int X;
};
如果func
是public,那么你可以写
Test t;
Test::X x;
t.func(x)
这对于我想到的 Curiously Recurring Template Pattern 的任何使用都令人满意。
除了 typedef,您还可以将类型声明为基类中的第二个模板参数 class:
template <typename T, typename X>
class Base
{
protected:
void func(X x) {}
};
class Test : public Base<Test, int>
{
public:
// typedef int X;
};
这对我有用:
template <typename T> struct Traits;
template <typename Derived>
class Base
{
protected:
void func(typename Traits<Derived>::X x) {}
};
class Test;
template <> struct Traits<Test>
{
typedef int X;
};
class Test : public Base<Test>
{
};
我想从模板化类型 Base
派生类型 Test
,我专门研究派生类型(即 Base<Test>
)。
在模板化类型中,我想使用在派生类型(模板参数)中定义的 typedef。
但是,我得到这个编译错误:
error C2039: 'X' : is not a member of 'Test'
这是代码片段:
template <typename T>
class Base
{
protected:
void func(typename T::X x) {}
};
class Test : public Base<Test>
{
public:
typedef int X;
};
这可行吗?如果可行,我需要做什么修复?
(我看到了针对此类问题的几个答案,但看起来我的情况并没有通过前缀类型名称来解决 - 它是否与从专门用于派生类型的模板派生有关?)
我不确定这种行为,也许有人可以澄清一下。但据我所知,在你做 : public Base<Test>
的那一刻,类型名称 X 不存在(因为在下面声明)。
如果您在进行继承之前创建包装器 class,则在您进行继承时类型将存在,并且模板实例化将起作用。
这是用 VC++ 2013
编译的template <typename T>
class Base
{
protected:
void func(typename T::X x) {}
};
class TestWrapper
{
public:
typedef int X; //Declared, now it exists for the compiler
};
class Test
:public Base<TestWrapper> //Compiles correctly
{
};
您有一个无法通过前向声明解决的循环问题。但这会起作用,尽管(我怀疑)没有像你想要的那样强烈定义。
template <typename T>
class Base
{
protected:
template<typename Y>
void func(Y x) {}
};
class Test : public Base<Test>
{
public:
typedef int X;
};
如果func
是public,那么你可以写
Test t;
Test::X x;
t.func(x)
这对于我想到的 Curiously Recurring Template Pattern 的任何使用都令人满意。
除了 typedef,您还可以将类型声明为基类中的第二个模板参数 class:
template <typename T, typename X>
class Base
{
protected:
void func(X x) {}
};
class Test : public Base<Test, int>
{
public:
// typedef int X;
};
这对我有用:
template <typename T> struct Traits;
template <typename Derived>
class Base
{
protected:
void func(typename Traits<Derived>::X x) {}
};
class Test;
template <> struct Traits<Test>
{
typedef int X;
};
class Test : public Base<Test>
{
};