【问题标题】:How do I specialize a member function of a template class?如何专门化模板类的成员函数?
【发布时间】:2021-02-20 07:54:10
【问题描述】:
template<typename _TChar>
struct simplestring
{
    void show_tstring()
    {
        throw "no implement";
    }

    void simplestring<char>::show_tstring()
    {
        cout << "char string\n";
    }

    void simplestring<wchar_t>::show_tstring()
    {
        cout << "wchar_t string\n";
    }
};


void test()
{
    simplestring<char> s;
    s.show_tstring();
}

我想专门化simplestring的成员函数show_tstring。当 _TChar 为 char 时输出“char string\n”,当 _TChar 为 wchar_t 时输出“wchar_t string\n”。否则抛出异常。

编译时出现错误信息:

错误 C2535 'void simplestring<_tchar>::show_tstring(void)': 成员 已定义或声明的函数

我也尝试过把函数放到类之外,

void simplestring<char>::show_tstring()
{
    cout << "char string\n";
}

编译失败

错误 C4430 缺少类型说明符 - 假定为 int。注意:C++ 没有 支持 默认-int ForTest D:\test\ForTest\ForTest\templateTest.h 848

【问题讨论】:

  • 您忘记提及显示代码的问题。
  • @cigien,它无法编译。
  • 是的,但是你需要显示错误信息。
  • “它不能编译”到底是怎么回事?发生什么了?如果你打电话给你的汽车修理工并告诉他们“我的车不动”,仅此而已,你认为你会得到解决问题的有用提示吗?

标签: c++ templates c++17


【解决方案1】:

在您的情况下,在 C++17 中,您可能会这样做:

template <typename Char>
struct simplestring
{
    void show_tstring() const
    {
        if constexpr (std::is_same_v<Char, char>) {
            std::cout << "char string\n";
        } else if constexpr (std::is_same_v<Char, wchar_t>) {
            std::cout << "wchar_t string\n";
        } else {
            throw "no implement";
        }
    }
};

在 C++20 中,您可能会这样做:

template <typename Char>
struct simplestring
{
    void show_tstring() const requires (std::is_same_v<Char, char>)
    {
        std::cout << "char string\n";
    }
    void show_tstring() const requires (std::is_same_v<Char, wchar_t>)
    {
        std::cout << "wchar_t string\n";
    }
    // nothing for other (instead of exception)
};

【讨论】:

    【解决方案2】:

    将特化移到类主体之外:

    template<typename _TChar>
    struct simplestring
    {
        void show_tstring()
        {
            throw "no implement";
        }
    };
    
    template<>
    void simplestring<char>::show_tstring()
    {
        std::cout << "char string\n";
    }
    
    template<>
    void simplestring<wchar_t>::show_tstring()
    {
        std::cout << "wchar_t string\n";
    }
    

    演示:https://godbolt.org/z/6n8E51

    【讨论】:

    • 非常感谢。我刚刚在课堂外尝试了template&lt;char&gt; void simplestring::show_tstring(),比正确的慢了一步:D。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2021-06-21
    • 1970-01-01
    • 2019-03-24
    • 2011-04-01
    相关资源
    最近更新 更多