C++ 如何在模板化类的“命名空间”中生成非模板化typedef?

C++ 如何在模板化类的“命名空间”中生成非模板化typedef?,c++,templates,namespaces,scope,C++,Templates,Namespaces,Scope,假设我有这个班: template <typename T> class A { T datum; void foo(); } 问题是,我希望颜色只在类中定义,而不是模板化,即我希望能够做到: A<int> a; a.bar(A::Red); 似乎没有编译。这也不是: typedef enum {Red, Green, Blue} A::Color; template <typename A> class A { /* ... */ }

假设我有这个班:

template <typename T> class A {
    T datum;
    void foo();
}
问题是,我希望颜色只在类中定义,而不是模板化,即我希望能够做到:

A<int> a;
a.bar(A::Red);
似乎没有编译。这也不是:

typedef enum {Red, Green, Blue} A::Color;
template <typename A> class A { /* ... */ }
那么,我可以以某种方式定义A::Color吗?

编辑

会议结束后:

我认为你能得到的最好的东西是这样的:

template<typename T = void> class A;

template<> class A<void>{
public:
    enum Color { Red };
};

template <typename T> class A : public A<>{
      T datum;
public:
      void foo(){}
      void bar(Color c){}
};

int main()
{
     A<int> a;
     a.bar(A<>::Red);
}

这不会将枚举引入名为a的范围;但它会使枚举和更重要的函数void barColor color非模板化。

但这不意味着模板类名为MyBase::A,typedef名为MyBase::color吗?@einpoklum更新了我的应答器,但bar使用了数据。。。让我在问题中澄清这一点。或嗯。也许如果我们继承酒吧?@einpoklum最后,我想我明白你的问题了。是吗?是的,现在你做到了。我想那还不错!我想你可以放弃原来的答案。。。
namespace A {
    typedef enum {Red, Green, Blue} Color;
}
template <typename T> class A { /* ... */ }
typedef enum {Red, Green, Blue} A::Color;
template <typename A> class A { /* ... */ }
template<typename T = void> class A;

template<> class A<void>{
public:
    enum Color { Red };
};

template <typename T> class A : public A<>{
      T datum;
public:
      void foo(){}
      void bar(Color c){}
};

int main()
{
     A<int> a;
     a.bar(A<>::Red);
}
class A_base{
public:
    typedef enum {Red, Green, Blue} Color;
    void bar(Color color){}
};

template <typename T> class A : public A_base{
     T datum;
     void foo(){}
};

int main()
{
    A<int> a;
    a.bar(A_base::Red);
}