【问题标题】:invalid conversion from ‘const int*’ to ‘int*’ in template function模板函数中从“const int*”到“int*”的无效转换
【发布时间】:2019-11-18 19:45:13
【问题描述】:
class A{
    private:
        T x;
    public:
        A():x(0){}
        A(T x1):x(x1){}

        void printInfo(const T& a){
            cout<<"Succes1"<<endl;
        }
};

class B{
    private:
        int x;
        A<int*> var;
    public:
        B():x(0){}
        B(int x1):x(x1){}

        void printInfo(const int * a){
            var.printInfo(a);
        }
};

问题与

void printInfo(const int * a){
    var.printInfo(a);
}

它给出了一个错误,说从'const int*'到'int*'的转换无效

但适用于int *aint *const a

不应在 A 类中 void printInfo 看起来像

void printInfo(const int* a)

这对吗?

cont int *p, //pointer to constant int

int* const p //constant pointer to int

如果是这样的话,应该有错误

printInfo(int* const a)

没有

printInfo(const int * a)

【问题讨论】:

    标签: c++


    【解决方案1】:

    不应在 A 类中 void printInfo 看起来像

    void printInfo(const int* a)
    

    这对吗?

    不,问题在于您在B 中将var 声明为A&lt;int*&gt;,所以A

    void printInfo(const T& a); 
    

    真的

    void printInfo( int* const& a); 
    

    而不是

    void printInfo( int const* & a); 
    

    因此,要使B 中的调用正常工作,您需要将var 声明为A&lt;int const*&gt;。参见编译版本here

    【讨论】:

      【解决方案2】:
      void printInfo(const int * a){
      

      B 类中的 void printInfo 不应该看起来像

      void printInfo(const int* a)
      

      这对吗?

      两者是等价的。在许多情况下,空格与语法无关。

      cont int *p, //pointer to constant int
      
      int* const p //constant pointer to int
      

      这些都是正确的。

      如果是这样的话,应该有错误

      printInfo(int* const a)
      

      没有

      printInfo(const int * a)
      

      错误应该是当您尝试将指向 const 的指针隐式转换为指向非 const 的指针时。

      【讨论】:

      • 我的意思是说 A 类中的 void printInfo 不应该看起来像 void printInfo(const int* a)。那为什么当两个类中的函数参数相同时,它试图将指向 const 的指针转换为指向非 const 的指针
      猜你喜欢
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2012-03-30
      相关资源
      最近更新 更多