使用外部类的模板参数设置内部模板类的默认模板参数 瞄准Visual Studio C++ 2008

使用外部类的模板参数设置内部模板类的默认模板参数 瞄准Visual Studio C++ 2008 ,c++,templates,visual-c++,C++,Templates,Visual C++,情况:我有一个包含大量参数的模板类,其中许多参数是默认值 template <typename A, typename B = b, typename C = c> struct Outer { typedef typename A typeA; typedef typename B typeB; typedef typename C typeC; }; 这是可行的,但很快就会变得无聊。(以及来自真实代码的其他复杂性)。我在想。。。为什么不使用作为默认值传入

情况:我有一个包含大量参数的模板类,其中许多参数是默认值

template <typename A, typename B = b, typename C = c>
struct Outer
{
    typedef typename A typeA;
    typedef typename B typeB;
    typedef typename C typeC;
};
这是可行的,但很快就会变得无聊。(以及来自真实代码的其他复杂性)。我在想。。。为什么不使用作为默认值传入的模板参数创建一个新的内部类,所以我尝试这样做:

template<typename A, typename B>
struct AnotherUserDefinedType {
    template<typename CC, typename AA = A, typename BB = B>
    struct Inner : public Outer<AA, BB, CC> {};

    Inner<int> AnIntInner;
    Inner<float> AFloatInner;
};
模板
结构另一个用户定义的类型{
模板
结构内部:公共外部{};
内衬管;
内漂浮内;
};
当我尝试编译此文件时,会出现一个“模板参数太少”错误,该错误似乎附加到成员的声明中(在本例中是一个tinner)

我想知道的是:这(使用外部类的模板参数作为内部类的默认模板参数)是可能的吗

如果可能,是我的构造错误还是MSVC++2008存在已知问题?或者,当然,如果我的代码中可能还有其他错误

更新

啊,事后诸葛亮总是很好。我发现我的问题和我真正需要的答案至少有一些问题

首先,DYP在调用SSCCE时是正确的,即使我只缺了五行完整的例子(如果我进入了模糊C++竞赛),我看过我的代码,并说“这看起来是正确的,所以我必须尝试的新事物会导致问题”,我甚至没有建立我自己的例子。我需要处理编译器发出的模板错误消息(哦,是的,还有ass-u-me-ing部分…)

然而,@nickie礼貌地没有说,这个结构是多余的。默认模板参数有其位置,但在这里,甚至不需要它。内部类可以看到外部类中使用的模板参数。更好的方法是只模板化我需要的“自由”参数。我认为@nickie完美地回答了这个问题,尽管技术上我一开始并没有错,所以@nickie的答案得到了勾选

但这并没有结束一切@DyP正确地理解了我真正的问题,那就是我想要咖喱一些模板参数(在这里重新复制外部模板参数确实有它的用途,我们想要改变模板参数,而不是像真正的咖喱那样紧密地绑定它(好吧,咖喱参数可能是一个函子…但我离题了)). 我只是需要类型,而不是扩展类。继承的问题是它破坏了一些重写,即运算符=()

所以,结合我们三个人的输入,这个结构就是我最后使用的

template<typename A, typename B>
struct FinalUserDefinedType {
    template<typename C, typename AWithDefault = A>
    struct CurryType {
        typedef Outer<AWithDefault, B, C> type;
    };

    CurryType<int>::type AnIntOuter;
    CurryType<float>::type AFloatOuter;
    CurryType<double, int>::type AnOverriddenDefault;
};
模板
结构FinalUserDefinedType{
模板
结构货币类型{
typedef外部类型;
};
CurryType::输入一个入口;
CurryType::漂浮型;
CurryType::类型AnoverridendedFault;
};
更新2

愚弄我一次,为我感到羞耻,愚弄我两次,把我送到第九圈

再一次,我没有编译我给出的示例。从我的真实代码中删除(@DyP再次捕捉到这一点…),示例应该是:

template<typename A, typename B>
struct FinalUserDefinedType {
    template<typename C, typename AWithDefault = A>
    struct CurryType {
        typedef Outer<AWithDefault, B, C> type;
    };

    typename CurryType<int>::type AnIntOuter;
    typename CurryType<float>::type AFloatOuter;
    typename CurryType<double, int>::type AnOverriddenDefault;
};
模板
结构FinalUserDefinedType{
模板
结构货币类型{
typedef外部类型;
};
typename CurryType::键入一个输入器;
typename CurryType::type aflaouter;
typename CurryType::type AnoverridEndeFault;
};

对于虚拟奖励积分,是否可以在不使用
typename
的情况下声明
intouter
等?

我认为这是您想要的正确方法(如果我正确理解了这一点):

模板
结构外部
{
typedef A typeA;
typedef B typeB;
typedef C typeC;
};
模板
结构另一个用户定义的类型{
模板
结构内部:公共外部{};
内衬管;
内漂浮内;
};

我认为这是做你想做的事情的正确方法(如果我正确理解了这一点):

模板
结构外部
{
typedef A typeA;
typedef B typeB;
typedef C typeC;
};
模板
结构另一个用户定义的类型{
模板
结构内部:公共外部{};
内衬管;
内漂浮内;
};

typedef typename A typeA
请在这里键入名称
。(见)请提供一份报告。在VS2008上编译良好。顺便说一句:您不需要从
外部继承
,还可以使用typedef:
模板结构内部{typedef Outer type;}typename内部::键入一个内部标识符
我知道VS2008不需要或不强制执行它,但您确实应该在这里使用
typename
typename CurryType::键入一个浏览器类型定义类型名称A类型A
请在这里键入名称
。(见)请提供一份报告。在VS2008上编译良好。顺便说一句:您不需要从
外部继承
,还可以使用typedef:
模板结构内部{typedef Outer type;}typename内部::键入一个内部标识符
我知道VS2008不需要或不强制执行它,但您确实应该在这里使用
typename
typename CurryType::键入一个浏览器template<typename A, typename B>
struct FinalUserDefinedType {
    template<typename C, typename AWithDefault = A>
    struct CurryType {
        typedef Outer<AWithDefault, B, C> type;
    };

    typename CurryType<int>::type AnIntOuter;
    typename CurryType<float>::type AFloatOuter;
    typename CurryType<double, int>::type AnOverriddenDefault;
};
template <typename A, typename B = b, typename C = c>
struct Outer
{
    typedef A typeA;
    typedef B typeB;
    typedef C typeC;
};

template<typename A, typename B>
struct AnotherUserDefinedType {
    template<typename C>
    struct Inner : public Outer<A, B, C> {};

    Inner<int> AnIntInner;
    Inner<float> AFloatInner;
};