微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C通过const引用传递一个const指针

在VC2012中我是一个奇怪的人我似乎无法弄清楚通过const引用将const指针传递给模板化参数的函数的语法,模板参数是非常量指针,即:
template<typename T>
struct Foo
{
    void Add( const T& Bar ) { printf(Bar); }
};

void main()
{
Foo<char*> foo;
const char* name = "FooBar"; 
foo.Add(name);                 // Causes error
}

所以我在这里简化了我的问题,但基本上我希望参数’Add’有一个const T即const char *.我试过了:

void Add( const (const T)& Bar ); 

typedef const T ConstT;
void Add( const (ConstT)& Bar );  

void Add( const typename std::add_const<T>::type& Bar );

这些都不起作用.我得到的确切错误是:

error C2664: 'Foo<T>::Add' : cannot convert parameter 1 from 'const char *' to 'char *const &'
          with
          [
              T=char *
          ]
          Conversion loses qualifiers

我可以看到它是正确的,但如何解决它没有常量’name’为非const.

解决方法

看起来你的问题是,只要你有一个映射到模板类型的指针类型,你就不能再将指针添加到指向类型,只能指向指针本身.你想要做的是自动添加constness到函数的参数(所以如果T是char *,函数应该接受const char * const&而不是char * const&和你写的那样).唯一的方法是使用另一个模板将constness添加到指针类型的指针,如下所示.我冒昧地包括丢失的标题和更正主要的签名:
#include <cstdio>

template<typename T>
struct add_const_to_pointee
{
    typedef T type;
};

template <typename T>
struct add_const_to_pointee<T*>
{
    typedef const T* type;
};

template<typename T>
struct Foo
{
    void Add( typename add_const_to_pointee<T>::type const & Bar ) { printf(Bar); }
};

int main()
{
    Foo<char*> foo;
    const char* name = "FooBar";
    foo.Add(name);                 // Causes error
}

然而,正如另一个人所提到的,如果你使用std :: string而不是C风格的字符串,这个问题就会消失.

原文地址:https://www.jb51.cc/c/116722.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐