Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类型推断失败:将派生模板共享到基模板作为函数参数_C++_Templates_Shared Ptr - Fatal编程技术网

C++ 类型推断失败:将派生模板共享到基模板作为函数参数

C++ 类型推断失败:将派生模板共享到基模板作为函数参数,c++,templates,shared-ptr,C++,Templates,Shared Ptr,这里我声明了两个模板类:A和B,B派生自A: 我使用g++作为编译器,使用-std=c++11 这个错误给我带来了很多问题,我怎样才能优雅地修复它呢?给定proc(b),b需要转换为std::shared\u ptr。这意味着将构造一个临时的std::shared_ptr,然后将其传递给proc。proc的参数类型是对非常量的左值引用,即std::shared\u ptr&,不能绑定到临时变量 您可以将参数类型更改为对const的左值引用,这可以绑定到临时变量。e、 g template<

这里我声明了两个模板类:A和B,B派生自A:

我使用g++作为编译器,使用-std=c++11

这个错误给我带来了很多问题,我怎样才能优雅地修复它呢?

给定
proc(b)
b
需要转换为
std::shared\u ptr
。这意味着将构造一个临时的
std::shared_ptr
,然后将其传递给
proc
proc
的参数类型是对非常量的左值引用,即
std::shared\u ptr&
,不能绑定到临时变量

您可以将参数类型更改为对const的左值引用,这可以绑定到临时变量。e、 g

template<typename T>
void proc(const std::shared_ptr<A<T>> &a) {
//        ^^^^^
    std::cout << a->a << std::endl;
}
模板
作废程序(常数标准::共享\u ptr&a){
//        ^^^^^
标准::cout a给定
proc(b)
b
需要转换为
std::shared_ptr
。这意味着将构造一个临时的
std::shared_ptr
,然后将其传递给
proc
proc
的参数类型是对非常量的左值引用,即
std::shared_ptr&
,它不能绑定到临时变量

您可以将参数类型更改为对const的左值引用,这可以绑定到临时变量

template<typename T>
void proc(const std::shared_ptr<A<T>> &a) {
//        ^^^^^
    std::cout << a->a << std::endl;
}
模板
作废程序(常数标准::共享\u ptr&a){
//        ^^^^^

std::cout a首先,您可以创建一个名为:

auto b = std::make_shared<B<std::string>>();
因此,它不引用A,并且B可以在函数调用期间轻松转换为A


编辑:添加了解释

说明:

还记得指针吗?从C…是的,它们具有相同的引用功能:

是的,这些是C中伪返回类型的函数,比如:

// Compilable both in C and C++...
int main(void) {
    int more_3;
    int const res = add(2, 3, &more_3);
    printf("Sum of 2 + 3 is %i\n", res);
    if (more_3)
        printf("Given two numbers' sum is more than 3");
}
在这里,传递了一个额外的参数,它接受变量a(引用也做同样的事情,它们与引用它们的变量共享地址…)

请记住,引用和指针在其中存储另一个变量的地址

<>这可能是他们在C++(.c++)中引用操作符(<代码>和代码> >的原因。
同样,不需要,但发布在此处的答案有效,因为:

void proc(std::shared_ptr<A<T>> const &a)
void进程(标准::共享\u ptr const&a)

使用一个常量引用,一个常量表达式的引用,而不是一个变量,所以如果它们不匹配(
a
B

首先,您创建一个
共享的ptr

auto b = std::make_shared<B<std::string>>();
因此,它不引用A,并且B可以在函数调用期间轻松转换为A


编辑:添加了解释

说明:

还记得指针吗?从C…是的,它们具有相同的引用功能:

是的,这些是C中伪返回类型的函数,比如:

// Compilable both in C and C++...
int main(void) {
    int more_3;
    int const res = add(2, 3, &more_3);
    printf("Sum of 2 + 3 is %i\n", res);
    if (more_3)
        printf("Given two numbers' sum is more than 3");
}
在这里,传递了一个额外的参数,它接受变量a(引用也做同样的事情,它们与引用它们的变量共享地址…)

请记住,引用和指针在其中存储另一个变量的地址

<>这可能是他们在C++(.c++)中引用操作符(<代码>和代码> >的原因。
同样,不需要,但发布在此处的答案有效,因为:

void proc(std::shared_ptr<A<T>> const &a)
void进程(标准::共享\u ptr const&a)

使用常量引用,对常量表达式的引用,而不是变量,因此它们是否不匹配并不重要(
a
B

它是有效的!非常感谢。尽管我仍然很困惑,为什么从
shared\u ptr
shared\u ptr&
的演绎是无效的?B是从a派生的,所以我们可以说B是a对的。@forrestJiang即使它们是派生的,
a
B
是不同的类,引用类似于C中的指针d将不同类型的指针分配给另一个指针(使用非法强制转换)导致不确定行为,为了防止在C++中发生引用,因为它引用了一个实例:<代码> < <代码> > <代码> b >代码>……注意:如果使用指针,C++将具有与C相同的结果,虽然…它很有效,谢谢。尽管我仍然困惑,为什么从代码> SyddP中得到一个演绎。tr
to
shared&
无效?B是从A派生的,因此我们可以说B是A right?@forrestJiang即使它们是派生的,
A
B
是不同的类,引用类似于C中的指针,并将不同类型的指针分配给另一个指针(使用非法强制转换)导致不确定行为,为了防止C++中引用引用的发生,它会引用错误,因为它引用了一个实例:<代码> < <代码> > <代码> b>代码>……注意:如果使用指针,C++将具有与C相同的结果,尽管…
void proc(std::shared_ptr<A<T>> a)
// Compilable both in C and C++...
int add(int a, int b, int * more_than_3) {
    int const result = a + b;
    if (result > 3)
        *more_than_3 = 1;
    return result;
}
// Compilable both in C and C++...
int main(void) {
    int more_3;
    int const res = add(2, 3, &more_3);
    printf("Sum of 2 + 3 is %i\n", res);
    if (more_3)
        printf("Given two numbers' sum is more than 3");
}
void proc(std::shared_ptr<A<T>> const &a)