我试图调用一个模板类成员函数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 - 那么它会像我一样工作期待,即我看到带有正确值的印刷文本。
有可能做我想做的事吗?如果是这样,怎么样?谢谢!
答案 0 :(得分:6)
语法将是:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="campo"></div>
答案 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;
}