繁体   English   中英

如何实例化 class 的 static 成员方法模板?

[英]How can i instantiate a static member method template of a class?

我想为传递给它的不同类型实例化My::name()方法:

#include <string>
#include <iostream>

namespace prw
{
    class My
    {
    public:
        template <typename TYPE>
        static std::string name(TYPE v);
    };
}

std::string prw::My::name(int v)
{
    return "Ok";
}


int main()
{
    std::cout << prw::My::name(1) << std::endl;

    return 0;
}

编译器 output:

main.cpp:14:17: error: no declaration matches 'std::string prw::My::name(int)'
   14 |     std::string prw::My::name(int v)
      |                 ^~~
main.cpp:10:28: note: candidate is: 'template<class TYPE> static std::string prw::My::name(TYPE)'
   10 |         static std::string name(TYPE v);
      |                            ^~~~
main.cpp:6:11: note: 'class prw::My' defined here
    6 |     class My
      |           ^~

顺便说一句,stackoverflow 告诉我:

看起来您的帖子主要是代码; 请添加更多详细信息。

尽管通过查看代码和编译器的 output,我的问题很简单且不言自明。

我做错了什么? 该死:(

您正在尝试专门化模板,而不是实例化它。 专门化的语法是:

template<>
std::string prw::My::name(int v)
{
    return "foo";
}
// And if you want to further specialize for other types:
template<>
std::string prw::My::name(bool v)
{
    return "bar";
}

专业化定义了模板如何在某种类型上工作。 实例化导致编译器为其生成代码并比正常情况下更早地检查其有效性。 通常情况下,编译器会在 function 的第一个调用站点使用特定类型执行此操作,但出于多种原因,您可能希望在发生这种情况时进行更改(例如,这使您可以在 header 文件之外定义模板)。 显式实例化的语法,特别是通过提供显式实例化定义的方式是:

namespace prw
{
    class My
    {
    public:
        template <typename TYPE>
        static std::string name(TYPE v)
        {
            return "Ok"; // notice how name has a body now
        }
    };
}

template std::string prw::My::name(int v); // name is instantiated here instead of below


int main()
{
    std::cout << prw::My::name(1) << std::endl;

    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM