C++ 在命名空间上专门化的模板

C++ 在命名空间上专门化的模板,c++,templates,namespaces,C++,Templates,Namespaces,鉴于: 我想在命名空间a或B上模板化一个类,以使以下功能正常工作: namespace A { class Foo; class Bar; } namespace B { class Foo; class Bar; } 模板类C{ 名称::Foo*Foo; 名称::Bar*Bar; } 这可以直接完成,还是需要创建一对包含typedef的结构类型?否,模板不能在命名空间上参数化。不能在命名空间上创建模板。如果您能够使用一个类(最有可能使用公共属性/静态方法),那么您可以将该

鉴于:

我想在命名空间a或B上模板化一个类,以使以下功能正常工作:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}
模板类C{
名称::Foo*Foo;
名称::Bar*Bar;
}

这可以直接完成,还是需要创建一对包含typedef的结构类型?

否,模板不能在命名空间上参数化。

不能在命名空间上创建模板。如果您能够使用一个类(最有可能使用公共属性/静态方法),那么您可以将该类作为一个半解决方案来使用模板。

以我有限的知识,我相信这将是一个有用的工具,并且似乎是一种关系,它可以在名称空间和模板之间存在。然而,这将很难实施,也没有必要

在上面的示例中,我将使用结构而不是名称空间(我在
class
上使用
struct
,因为默认情况下它的访问是“public”)。下面是一个完全可编译的示例:

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
}

我的想法是从继承模板类,尽管我承认,在没有像我那样定义
myFunc()
的情况下,继承模板是可选的。这篇文章值得一看。它有许多使用模板的有用和非常规技巧。

模板参数不允许是命名空间。
#include <iostream>

// Replaces namepace 'A' from above.
templates
struct Option1 {

    class Foo;

    //Example function, too.
    void myFunc() {
        std::cout << "Hello!\n";
    }
};

// A second Option for example.
struct Option2 {
    class Foo;

    void myFunc() {
        std::cout << "Hola!!\n";
    }
};

// Can be in .cpp file
class Option1::Foo {
public:
    Foo() { display(); }

    void display() {
       std::cout << "Option 1.\n";
    }
};

class Option2::Foo {
public:
    Foo() { display(); }

    void display() {
        std::cout << "Option 2.\n";
    }
};
// The typename C would need class 'Foo' 
template <typename C>
class OptionSelect : public C
{
    typename C::Foo* foo;

    public:
    OptionSelect() {
        foo = new typename C::Foo();
    }

};

int main() {
    OptionSelect<Option1> opt1;
    OptionSelect<Option2> opt2;

    opt1.myFunc();  // Provided that template had myFunc
    opt2.myFunc();         

    return 0;
}
Option 1.
Option 2.
Hello!
Hola!!