我很感激帮助解决以下错误。即使struct Frobnigator声明了这样的成员,我也会在Attributes
错误中找到'struct Frobnigator<Foo>
类型,如下所示(另请参阅ideone.com)。
struct Foo{};
struct Bar{};
/////////////////////////////////////////////////////////////////////////////
template<typename P>
struct Attributes
{
};
template<>
struct Attributes<Foo>
{
};
/////////////////////////////////////////////////////////////////////////////
template<typename P>
struct Frobnigator
{
Attributes<P> attributes;
};
/////////////////////////////////////////////////////////////////////////////
template<typename P>
struct OuterHandler
{
typedef Frobnigator<P> Frob;
template<typename T>
struct InnerHandler;
void doStuff();
};
template<>
struct OuterHandler<Foo>
{
typedef Frobnigator<Foo> Frob;
template<typename T>
struct InnerHandler;
void doStuff();
};
/////////////////////////////////////////////////////////////////////////////
template<typename P>
template<typename T>
struct OuterHandler<P>::InnerHandler
{
typename T::Attributes attributes;
InnerHandler(){}
};
template<typename T>
struct OuterHandler<Foo>::InnerHandler
{
typename T::Attributes attributes;
InnerHandler(){}
};
/////////////////////////////////////////////////////////////////////////////
template<typename P>
void OuterHandler<P>::doStuff()
{
InnerHandler<Frob>();
}
void OuterHandler<Foo>::doStuff()
{
InnerHandler<Frob>();
}
/////////////////////////////////////////////////////////////////////////////
int main()
{
return 0;
}
/////////////////////////////////////////////////////////////////////////////
Visual Studio错误消息
Test.cpp(62) : error C2039: 'Attributes' : is not a member of 'Frobnigator<P>'
with
[
P=Foo
]
Test.cpp(76) : see reference to class template instantiation 'OuterHandler<Foo>::InnerHandler<T>' being compiled
with
[
T=OuterHandler<Foo>::Frob
]
g ++(GCC)4.5.3错误消息
Test.cpp: In instantiation of ‘OuterHandler<Foo>::InnerHandler<Frobnigator<Foo> >’:
Test.cpp:76:21: instantiated from here
Test.cpp:62:25: error: no type named ‘Attributes’ in ‘struct Frobnigator<Foo>’
答案 0 :(得分:2)
有什么令人困惑的? Frobnigator<T>
确实没有名为Attributes
的类型成员。
如果您使用的是C ++ 11,请尝试:
typename decltype(T::attributes) attributes;
否则,反正可能更清楚:
template<typename P>
struct Frobnigator
{
typedef Attributes<P> attributes_type;
attributes_type attributes;
};
然后您可以在任何地方使用Frobnigator<T>::attributes_type
。
答案 1 :(得分:0)
如果我理解正确,那么您正在Boost中寻找与graph_traits<Graph>
类似的实现。
#include <iostream>
using namespace std;
struct Foo {};
template<typename T>
struct Attributes
{
};
template<>
struct Attributes<Foo>
{
};
template<typename T>
struct Frobnigator
{
typedef Attributes<T> Attr;
Attr attributes;
};
template<typename T>
struct traits
{
typedef typename T::Attr Attributes;
};
int main()
{
traits<Frobnigator<Foo> >::Attributes a;
return 0;
}