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; } |