返回值的简单模板类成员函数特化

时间:2018-06-11 22:34:12

标签: c++ c++11 templates template-specialization

我试图调用一个模板类成员函数specialized,它从类的构造函数中返回一个值,我似乎无法找到正确的语法(如果它存在)。下面是我的代码,下面是编译器(而不是链接器)的错误消息。

#include <iostream>

class A {};

class B {};

template <typename T>
class C
{
    public:
        C()
        {
            std::cout << "C constructed." << std::endl;
            std::cout << name() << std::endl;;
        }
        template constexpr const char * name();
};

template <> const char * C<A>::name() { return "You got an A."; }
template <> const char * C<B>::name() { return "You got a B."; }


int main()
{
    C<A> c_a;
    C<B> c_b;
    return 0;
}

错误讯息: g ++ -std = c ++ 11 -o t1 t1.cpp t1.cpp:19:18:错误:在'constexpr'之前预期'&lt;'          template constexpr const char * name();                   ^ t1.cpp:22:26:错误:'const char * C :: name()'的模板ID'名称&lt;&gt;'与任何模板声明都不匹配  模板&lt;&gt; const char * C :: name(){return“你有一个A.”; }                           ^ t1.cpp:22:37:注意:看到1'模板&lt;&gt;',需要2才能专门化成员函数模板  模板&lt;&gt; const char * C :: name(){return“你有一个A.”; }                                      ^ t1.cpp:23:26:错误:模板ID'名称&lt;&gt;'表示'const char * C :: name()'与任何模板声明都不匹配  模板&lt;&gt; const char * C :: name(){return“你有一个B.”; }                           ^ t1.cpp:23:37:注意:看到1'模板&lt;&gt;',需要2来专门化成员函数模板  模板&lt;&gt; const char * C :: name(){return“你有一个B.”; }

我搜索过并发现许多关于引发此错误消息的代码的讨论,但案例和建议似乎都不够接近且无关紧要。另外,如果我不尝试从专门的成员函数返回任何内容 - 如果它返回类型 void 并且只是打印到 cout - 那么它会像我一样工作期待,即我看到带有正确值的印刷文本。

有可能做我想做的事吗?如果是这样,怎么样?谢谢!

3 个答案:

答案 0 :(得分:6)

语法将是:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="campo"></div>

Demo

答案 1 :(得分:2)

你有点复杂了。函数声明中不需要“模板”。它只是一个普通的函数,恰好位于类模板中,并且您想要将它专门化为某些T。这是一种方法:

#include <iostream>

class A {};
class B {};

template <typename T>
class C {
public:
    C() {
        std::cout << "C constructed." << std::endl;
        std::cout << name() << std::endl;;
    }
    static constexpr const char * name();
};

template <> constexpr const char * C<A>::name() { return "You got an A."; }
template <> constexpr const char * C<B>::name() { return "You got a B."; }

int main() {
    C<A> c_a;
    C<B> c_b;
}

答案 2 :(得分:0)

为了记录,我找到了我发布的完全问题的解决方案 - 即使用成员函数而不是静态(或全局)函数here。< / p>

#include <iostream>

class A {};
class B {};

template <typename T>
class C
{
    template <typename U> struct type {};
    public:
        C()
        {
            std::cout << "C constructed." << std::endl;
            std::cout << name<T>() << std::endl;;
        }
        template <typename U> constexpr const char * name()
        {
            return name(type<U>());
        }


    private:
        template <typename U> constexpr const char * name(type<U>) {}
        constexpr const char * name(type<A>) { return "You got an A."; }
        constexpr const char * name(type<B>) { return "You got an B."; }
};

int main()
{
    C<A> c_a;
    C<B> c_b;
    return 0;
}