2016-12-28 106 views
0

我尝试写一些函数模板在这样的一个C++/CLI命名空间:函数模板++/CLI

// header file 
namespace MyCLI { 
    namespace MyFunctions { 
     template <typename T> 
     double sum(T a, T b) { 
      return (double) a + b; 
     } 
    } 
} 

的第一个问题是,当我编译该项目为一个dll,并尝试要使用它,名称空间MyFunctions不会显示出来。我认为,正在发生的事情,因为我还没有明确的实例化我的模板,我需要的所有类型,所以我添加下面的头文件的底部:

extern template double MyCLI::MyFunctions::sum<double>(double,double); 

但是,这仍然不给我访问功能sumdouble类型。我怀疑是因为项目被编译成托管代码,这是遵循C#的规则,你不能没有类没有功能。所以下次我试图做一个类的命名空间MyCLI内,使sum类的这样的静态成员:

// header file 
namespace MyCLI { 

    public ref class MyFunctions 
    { 
    public: 
     template <typename T> 
     static double sum(T a, T b) { 
      return (double) a + b; 
     } 
    }; 
} 

extern template double MyCLI::MyFunctions::sum<double>(double,double); 

现在,当我使用汇编我可以看到在MyCLIMyFunctions类,但我仍然无法访问该类的sum函数。

如果有人能给我任何关于如何解决这个问题的指示,或者我为什么首先面对这个问题,我将非常感激。

回答

3

这不是显式实例化模板的正确语法。您需要删除extern关键字并将实例化放在一个cpp文件中(而不是头文件),因此只定义一次。您无法看到该方法,因为由于缺少模板实例化而不存在。模板是而不是泛型,它们看起来很相似但有很大的不同。在编译时实例化,而泛型在运行时实现

但是,如果你打算使用此代码从你的运气了不同的.NET语言:该方法将字面上包含尖括号中的名字,所以你会使用它没有打破也很难该语言的命名规则。你可以使用反射,但我相信这不是你想要的。

对于这种简单的情况,您可以简单地写几个重载(根本不使用模板),这是最简单的事情。如果你想要更多花哨的东西,请参阅my answer here获取灵感。