我想这样做:
typedef MyTemplateClass<Type01, Type02> TClass;
TClass t;
TClass::InnerClass i;
i.test();
我认为解决方案可能是:
template <typename A, typename B>
class MyTemplateClass
{
public:
class InnerClass
{
//here I can do stuff with A and B
A test() { return 0; }
};
friend class InnerClass;
};
但我希望将ma模板放在头文件
底部的单独* .inl文件中如何在其他文件中定义此类行为?
当我做的时候
//file.inl
class InnerClass
{
//here I can do stuff with A and B
A test() { return 0; }
};
A和B未定义。
但是
template <typename A, typename B>
class InnerClass
{
...
};
使我的方法模板独立于MyTemplateClass类型......
再一句话: 如何通过提供
在其他文件中创建MyTemplateClass的InnerClassTClass::InnerClass i;
i.test();
行为?
答案 0 :(得分:7)
它与使用非模板时的工作方式相同:您必须完全限定成员的名称:
struct outer {
struct nested;
};
struct outer::nested {
int
test();
};
int
outer::nested::test()
{ /* whatever */ }
在你的情况下,是:
template <typename A, typename B>
class MyTemplateClass {
public:
class InnerClass;
friend class InnerClass;
};
// note the use of the <> brackets
template<typename A, typename B>
class MyTemplateClass<A, B>::InnerClass {
public:
A
test();
};
// ditto
template<typename A, typename B>
A
MyTemplateClass<A, B>::InnerClass::test()
{ return 0; }
你做必须警惕定义顺序,例如: MyTemplateClass
有使用InnerClass
的函数成员,然后必须在使用时显示InnerClass
的定义。
简单的经验法则:内联一切或无内容。您可以在InnerClass
内定义内联的所有内容(MyTemplateClass
类定义和两个类的函数成员),或者放置所有函数成员的所有定义(两者都是{已定义 MyTemplateClass
后的最后{1}}和InnerClass
}。
不要担心,如果你搞砸了你的编译器,只会很乐意帮助你处理错误信息。
答案 1 :(得分:4)
你做不到。简而言之。模板必须在实例化之前完全定义 - 这意味着无论你做什么,你都必须在模板类中定义内部类。