定义并调用 C++专用模板的功能

发布于 2024-12-12 03:06:23 字数 605 浏览 0 评论 0原文

我目前正在深入学习C++,我遇到了一些已经困扰了几个小时的东西。 为什么当我创建一个模板然后对其进行专门化时,我无法为专门版本调用或定义该函数?编译器会抱怨,我已经在 Google 上搜索了可能的提示:我做错了什么,但无济于事。我非常确定我忽略了一些非常简单的事情:

template <typename T>
class C { };

//specialization to type char
template <>
class C <char> 
{
  public:
    void echo();
};

//compiler complains here
template <>
void C <char> :: echo() 
{
  cout << "HERE" << endl;
}

错误:模板 ID 'echo<>' 'void C::echo()' 不匹配 任何模板声明

演示

I am currently learning C++ in-depth, and I have come across something that has stumped for a couple hours now. Why is it when I make a template and then specialize it, that I can't call or define that function for the specialized version? The compiler complains, and I have scoured Google for a possible hint as to what I am doing wrong, but to no avail. I am very sure it is something very simple that I am overlooking:

template <typename T>
class C { };

//specialization to type char
template <>
class C <char> 
{
  public:
    void echo();
};

//compiler complains here
template <>
void C <char> :: echo() 
{
  cout << "HERE" << endl;
}

error: template-id ‘echo<>’ for ‘void C::echo()’ does not match
any template declaration

Demo.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

与酒说心事 2024-12-19 03:06:23
//specialization to type char
template <>
class C <char>
{
  public:
    void echo();
};

//template<>  <----- don't mention template<> here
void C <char> :: echo()
{
  cout << "HERE\n";
}

Ps 当您指的是 '\n' 时,切勿说 endl什么是 C++ iostream endl 惨败?

//specialization to type char
template <>
class C <char>
{
  public:
    void echo();
};

//template<>  <----- don't mention template<> here
void C <char> :: echo()
{
  cout << "HERE\n";
}

P.s. Never say endl when you mean '\n'. What is the C++ iostream endl fiasco?

淡淡の花香 2024-12-19 03:06:23

Robᵩ 的回答解决了这个问题。最好了解更多原因。

来自显式(完整)模板专业化

专业成员

定义显式专用类模板的成员时
在类的主体之外,语法模板<>未使用,
除非它是明确专门的成员类的成员
template,专门作为类模板,因为否则,
语法需要这样的定义开头
嵌套模板所需的模板。

Robᵩ's answer fixes the issue. It will be good to know more about the reason.

From Explicit (full) template specialization:

Members of specializations

When defining a member of an explicitly specialized class template
outside the body of the class, the syntax template<> is not used,
except if it's a member of an explicitly specialized member class
template, which is specialized as a class template, because otherwise,
the syntax would require such definition to begin with
template required by the nested template.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文