gpt4 book ai didi

c++ - 使用空标记结构,编译器声称我缺少初始化器,但我不是

转载 作者:行者123 更新时间:2023-12-05 06:52:50 24 4
gpt4 key购买 nike

好的,我知道这与此类似 Why is the compiler throwing this warning: "missing initializer"? Isn't the structure initialized? ,但 GCC 肯定不会愚蠢到认为我要初始化没有初始化的东西?

//main.cpp
struct IsNamed{
};

template<typename T>
struct Test{
int foo;
};
struct Test2 : public Test<double>, public IsNamed{

};
int main(){
Test2 x;

Test2 y = Test2{Test<double>{}};
return 0;
}

这是输出:

main2.cpp: In function 'int main()':
main2.cpp:18:35: warning: missing initializer for member 'Test2::<anonymous>' [-Wmissing-field-initializers]
18 | Test2 y = Test2{Test<double>{}};
| ^
main2.cpp:16:11: warning: unused variable 'x' [-Wunused-variable]
16 | Test2 x;
| ^
main2.cpp:18:11: warning: variable 'y' set but not used [-Wunused-but-set-variable]
18 | Test2 y = Test2{Test<double>{}};
|

唯一令我感到困惑的警告是“缺少成员 'Test2::的初始值设定项”警告。这没有道理。我只需要一个可能的值,我会提供它。只是为了证明它确实是继承链中包含空类导致的,如果我删除它,这里是输出:

main2.cpp: In function 'int main()':
main2.cpp:16:11: warning: unused variable 'x' [-Wunused-variable]
16 | Test2 x;
| ^
main2.cpp:18:11: warning: variable 'y' set but not used [-Wunused-but-set-variable]
18 | Test2 y = Test2{Test<double>{}};
|

人们说忽略它,但这对我的项目来说是不可行的。我有很多 具有此错误的类遵循相同的标记结构模式。有选择地禁用此警告是不合理的(我发现它在其他情况下也很有用)。

我如何让编译器停止提示这个?我还应该提到 Test2{Test<double>{},{}};这不是一个合适的解决方案,因为我使用了模板代码,其中一些类没有这个问题,而另一些类有,这意味着在那些情况下这会成为一个错误。

编辑:

请注意这里使用的示例 CMake,其中包括编译器选项:

cmake_minimum_required(VERSION 3.13)
project(test)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_C_STANDARD 11)

add_executable(test main.cpp)
target_include_directories(test
PRIVATE
./
)
target_compile_options(test PRIVATE
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>>:
-Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -g -ggdb -O1>)

我也在用 mingw64-10.2

最佳答案

There's only one possible value I would need, and I provide it

警告不是关于提供您“需要”的值。毕竟,编译器通常无法知道您认为需要哪些值。

警告是关于提供所有初始化程序的。并且没有其他基地的初始化程序。

How do I get the compiler to stop complaining about this?

提供缺少的初始化器:

Test2 y = Test2{Test<double>{}, {}};

或者只是禁用警告。或者使用另一个编译器;例如,Clang 似乎不会在您的案例中发出警告。

关于c++ - 使用空标记结构,编译器声称我缺少初始化器,但我不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65896839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com