C ++编译器错误:"无法在初始化"中将std :: list(*)()转换为std :: list *

时间:2018-03-24 17:47:59

标签: c++ g++

假设以下代码:

std::list<Test1> l1();
std::list<Test1> *pl1 = &l1;

编译器在初始化中给出错误(略微缩短): Cannot convert std::list (*)() to std::list*

当没有括号初始化l1时,一切都很好。这里有什么问题,我该如何避免呢?

1 个答案:

答案 0 :(得分:2)

正如您所写,l1函数声明,不带参数并返回std::list<Test1>。想象一下,如果名称不同,这可能更容易吞下。

std::list<Test1> make_tests(); // cleary a function declaration, no?
std::list<Test1> l1(); // also a function declaration
std::list<Test1> l1; // can't be a function declaration, no ()
std::list<Test1> l1{}; // also can't be a function declaration

解决你的意见:

std::list<Test1> l1 = std::list<Test1>();

修复了你的问题,因为只有一种方法可以解释它,这是一个变量声明,然后是赋值。

这往往特别难以接受,所以让我把它放在一个更大的程序的背景下:

std::list<Test1> make_tests(); // according to your rules, should be a variable

int main() {
    std::list<Test1> tests = make_tests();
}

std::list<Test1> make_tests() {
    // ... function body ...
}

或者,如果您在{}或更晚

,则可以使用C++11
std::list<Test1> l1{};