关于c ++:返回值的简单模板类成员函数特化

Simple template class member function specialization that returns a value

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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::name() { return"You got a B."; }


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

错误消息:G++-STD= C++ 11 -O T1 T1.CPPT1.cpp:19:18:错误:应在"constexpr"之前输入"<"模板constexpr const char*name();^T1.cpp:22:26:错误:template id"name<>"for"const char*c::name()"不匹配任何模板声明template<>const char*c::name()return"您得到了一个a.";^T1.cpp:22:37:注意:saw 1"template<>",专门化成员函数模板需要2个template<>const char*c::name()return"您得到了一个a.";^T1.cpp:23:26:错误:template id"name<>"for"const char*c::name()"不匹配任何模板声明template<>const char*c::name()return"You got a b."";^T1.cpp:23:37:注意:saw 1"template<>",专门化成员函数模板需要2个template<>const char*c::name()return"You got a b."";

我已经搜索并发现了许多关于代码的讨论,这些代码引发了这个错误消息,但是案例和建议似乎都不够接近,没有相关性。另外,如果我不尝试从专门的成员函数返回任何东西——如果它有返回类型void,并且只是打印到cout——那么它会像我预期的那样工作,也就是说,我看到打印的文本具有正确的值。

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


语法会: </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <typename T>
class C
{
    public:
        C()
        {
            std::cout <<"C constructed." << std::endl;
            std::cout << name() << std::endl;;
        }
        constexpr const char* name();
};

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

演示 </P >


你是一位complicating信息。那里的冰不需要"模板"在函数的声明。它的功能是在西安,happens是在A级模板,你想它一定specialize t。这里的一种方式,这样做: </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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::name() { return"You got a B."; }

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


为记录,发现A溶液的精确的问题——我发布,即使用一个成员国的功能,而不是一个静态(或全球)的功能,在这里。 </P >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#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) { return"You got an B."; }
};

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