Templates 模板引用类为';在客户项目中看不到

Templates 模板引用类为';在客户项目中看不到,templates,c++-cli,Templates,C++ Cli,我有一个模板类: namespace MyApp { namespace Interop { template < class A, class B> public ref class MyClass { public: MyClass(){} ~MyClass(){} }; } } 名称空间MyApp { 命名空间互操作 { 模板 公共引用类MyClass { 公众: MyCla

我有一个模板类:

namespace MyApp
{
namespace Interop
{

    template < class A, class B>
    public ref class MyClass
    {
        public:
            MyClass(){}
            ~MyClass(){}

    };

}
}
名称空间MyApp
{
命名空间互操作
{
模板
公共引用类MyClass
{
公众:
MyClass(){}
~MyClass(){}
};
}
}

在客户端项目中,此类不可见:

class A;
class B;
using namespace MyApp::Interop;

void func()
{
    MyClass< A,B >^ h;
}
A类;
乙级;;
使用名称空间MyApp::Interop;
void func()
{
MyClass^h;
}
我得到错误C2065:“MyClass”:未声明的标识符。 如果MyClass不是模板,则在该上下文中可见。

C++模板

类模板具有C++模板的常用语义(换句话说,您不能期望CLR客户端)“神奇地”知道和实例化甚至不在汇编元数据(即反射信息)中可用的C++模板。 <经典的C++解决方案将是您希望使用的所有模板参数的实例化。

我将遵循C++的标准常见问题解答:

  • (关于显式实例化)
CLR泛型类型 如果需要通用CLR类型(即具有CLR语义),请使用
generic
而不是
template
。例如:

// generics_instance_fields1.cpp
// compile with: /clr
// Instance fields on generic classes
using namespace System;

generic <typename ItemType>
ref class MyClass {
// Field of the type ItemType:
public :
   ItemType field1;
   // Constructor using a parameter of the type ItemType:
   MyClass(ItemType p) {
     field1 = p; 
   }
};

int main() {
   // Instantiate an instance with an integer field:
   MyClass<int>^ myObj1 = gcnew MyClass<int>(123);
   Console::WriteLine("Integer field = {0}", myObj1->field1);

   // Instantiate an instance with a double field:
   MyClass<double>^ myObj2 = gcnew MyClass<double>(1.23);
   Console::WriteLine("Double field = {0}", myObj2->field1);

   // Instantiate an instance with a String field:
   MyClass<String^>^ myObj3 = gcnew MyClass<String^>("ABC");
   Console::WriteLine("String field = {0}", myObj3->field1);
}
//泛型\u实例\u字段1.cpp
//使用:/clr编译
//泛型类上的实例字段
使用名称空间系统;
通用的
参考类MyClass{
//ItemType类型的字段:
公众:
项目类型字段1;
//使用ItemType类型参数的构造函数:
MyClass(项目类型p){
field1=p;
}
};
int main(){
//使用整型字段实例化实例:
MyClass ^myObj1=gc新MyClass(123);
控制台::WriteLine(“整型字段={0}”,myObj1->field1);
//使用双字段实例化实例:
MyClass ^myObj2=gcnew MyClass(1.23);
控制台::WriteLine(“双字段={0}”,myObj2->field1);
//使用字符串字段实例化实例:
MyClass ^myObj3=gcnew MyClass(“ABC”);
控制台::WriteLine(“字符串字段={0}”,myObj3->field1);
}

<代码>这不是简单的C++。请用适当的语言(C++ + CLI或C++ + CX,无论它是什么)重新标记它。地球上的分号是在<代码>命名空间互操作{ /Cuth>??这是某种维京C++吗?你很有趣,让我们跳过去。