无法将模板成员函数专门化为 std::string

问题描述 投票:0回答:0

这是我要解决的问题。我有以下头文件:

class Foo
{
    public:
        Foo() {}
        ~Foo() {}

        template<typename T>
        T bar()
        {
            T var1 {65};
            T var2 {66};
            return var1 + var2;
        }
};

如果我运行以下 main.cpp

    printf("%d\n", f.bar<int>());
    printf("%f\n", f.bar<float>());
    printf("%s\n", f.bar<std::string>().c_str());

我得到了这个结果,正如预期的那样:

131
131.000000
AB

假设我想用 std::string 专门化这个案例。我首先尝试这样做:

class Foo
{
    public:
        Foo() {}
        ~Foo() {}

        template<typename T>
        T bar()
        {
            T var1 {65};
            T var2 {66};
            return var1 + var2;
        }

        template<>
        std::string bar()
        {
            return "Hello";
        }
};

但是编译器不高兴并说“错误:在非命名空间范围‘class Foo’中显式特化”。好的好的,我把它从头文件中删除并放在一个cpp文件中,就像这样:

    template<>
    std::string Foo::bar()
    {
        return "Hello";
    }

这一次编译器很高兴,但是当我运行程序时,我得到了相同的输出,并且没有选择 std::string 专业化。我希望主要返回这个:

131
131.000000
Hello

有人知道这里发生了什么吗?特别是,为什么我不能在头文件中声明特化?为什么 cpp 文件中的专业化不起作用?我错过了什么?

我正在使用 gcc 版本 8.5.0

谢谢

c++ templates template-specialization
© www.soinside.com 2019 - 2024. All rights reserved.