【问题标题】:Function templates in C++/CLIC++/CLI 中的函数模板
【发布时间】:2016-12-29 03:03:37
【问题描述】:

我正在尝试在 C++/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);

但这仍然无法让我访问 sum 类型的 double 函数。我的怀疑是,由于项目被编译成托管代码,这遵循了 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); 

现在,当我使用程序集时,我可以在 MyCLI 中看到 MyFunctions 类,但我仍然无法从该类访问 sum 函数。

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

【问题讨论】:

    标签: templates namespaces c++-cli


    【解决方案1】:

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

    但是,如果您打算使用其他 .NET 语言的代码,那么您就不走运了:该方法将字面意思在其名称中包含尖括号,因此您将很难在不违反语言命名规则的情况下使用它。您可以使用反射,但我确定这不是您想要的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-09
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      相关资源
      最近更新 更多