c++函数模板特化

发布于 2024-12-09 23:50:28 字数 484 浏览 1 评论 0原文

给出这段代码:

class X
{
public:
    template< typename T >
    void func( const T & v );
};

template<>
void X::func< int >( const int & v )
{
}

template<>
void X::func< char * >( const char * & v )       // 16
{
}

当我编译它时,出现以下错误。

test.cpp:16: error: template-id 'func<char*>' for 'void X::func(const char*&)' does not match any template declaration

任何人都可以阐明这一点吗?

Given this code:

class X
{
public:
    template< typename T >
    void func( const T & v );
};

template<>
void X::func< int >( const int & v )
{
}

template<>
void X::func< char * >( const char * & v )       // 16
{
}

When I compile it I get the following error.

test.cpp:16: error: template-id 'func<char*>' for 'void X::func(const char*&)' does not match any template declaration

Can anyone shed any light on this?

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

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

发布评论

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

评论(3

新人笑 2024-12-16 23:50:28

如果您将声明:更改

template<> void X::func< char * >( const char * & v )

为:,

template<> void X::func< char * >( char * const & v )

这将工作得很好。为什么会发生这种情况?因为虽然 const sometype 是完全可以接受的,但它只是 sometype const 的替代表示法。因此,您的 const 修饰符不会应用于基本类型 (char),而是应用于指针,从而使“指向非常量 char 的常量指针”成为有效类型。如果这不是您想要的,则必须更正您的基本模板。

最后,这里有一些关于为什么重载模板通常比专门化它们更好的有趣读物。

If you change the declaration:

template<> void X::func< char * >( const char * & v )

to:

template<> void X::func< char * >( char * const & v )

This would work perfectly fine. Why does it happen? Because while const sometype is perfectly acceptable, it's only an alternative notation for sometype const. So, your const modifier is not applied to the basic type (char), but to the pointer, making "constant pointer to non-constant char" a valid type. If that's not what you want, you'll have to correct your basic template.

Finally, here's some interesting reading for you about why overloading templates is generally better than specializing them.

回首观望 2024-12-16 23:50:28

您遇到此错误的原因是因为您在类型之前编写了 const 。尽管这是常见的做法,但它不利于理解 const/易失性限定符 (cv-qualifier) 的工作原理。

在这种情况下,当 Tchar* 时,const T 并不意味着 const char*。它的意思是 char* const 因为 Tchar* 并且无论您将 T 放在哪一边>const 它的行为就好像 const 位于 T 的右侧,也就是说,指针本身将是 const,而不是指向的类型。

如果您制定一条规则,始终将 constvolatile 放在类型的右侧,则很容易避免这种类型的混淆。例如,当 Tchar*char* const 时,可以在心里轻松地扩展 T const

这就是在 boost 源中您在类型之后而不是之前看到 cv 限定符的原因。

The reason you face this error is because you write const before the type. Although this is common practise, it is not conducive to understanding how const/volatile-qualifiers (cv-qualifier) work.

In this case const T when T is char* doesn't mean const char*. It rather means char* const because T is char* and no matter which side of T you put const it behaves as if const is on the right of T, that is, the pointer itself that is going to be const not the type pointed too.

It is easy to avoid this type of confusion if you make it a rule to always put const or volatile on the right of the type. For example, it makes it straightforward to mentally expand T const when T is char* to char* const.

This is the reason in boost sources you see cv-qualifiers after the type, not before.

没有心的人 2024-12-16 23:50:28

const 移到 & 之前

template<> 
void X::func< char * >( char * const & v ) 
{ 
} 

Move const before &

template<> 
void X::func< char * >( char * const & v ) 
{ 
} 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文