首页 > 解决方案 > 使用空标签结构,编译器声称我缺少初始化程序,但我不是

问题描述

好的,我知道这类似于为什么编译器会抛出此警告:“缺少初始化程序”?结构没有初始化吗?,但是 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

标签: c++gccinitializationwarningscompiler-warnings

解决方案


我只需要一个可能的值,我提供了它

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

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

如何让编译器停止抱怨这个?

提供缺少的初始化程序:

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

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


推荐阅读