【发布时间】:2021-08-14 06:49:38
【问题描述】:
我正在学习 C++ 类模板。下面是我的代码。当我运行它时,我收到“从这里需要”的错误。如果有人能指出这个问题,那将是很大的帮助。错误行号对应frank对象的实例化。
#include <iostream>
#include <string>
template <typename T>
class Data
{
private:
std::string name;
T value;
public:
Data(std::string n, T v) : value {v}, name {n}
{
}
~Data() = default;
T getValue()
{
return value;
}
std::string getName()
{
return name;
}
};
int main()
{
Data<int> frank {"frank", 35};
std::cout << std::endl;
}
添加构建日志:
C:\WINDOWS\system32\cmd.exe /C mingw32-make.exe -j 8 -e -f Makefile
"----------Building project:[ TestArea - Debug ]----------"
mingw32-make.exe[1]: Entering directory 'C:/Users/LPC/Documents/C_Plus_Plus/TestArea'
mingw32-make.exe[1]: Leaving directory 'C:/Users/LPC/Documents/C_Plus_Plus/TestArea'
mingw32-make.exe[1]: Entering directory 'C:/Users/LPC/Documents/C_Plus_Plus/TestArea'
g++ -c "C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp" -g -O0 -std=c++14 -Wall -o ./Debug/main.cpp.o -I. -I.
C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp: In instantiation of 'Data<T>::Data(std::__cxx11::string, T) [with T = int; std::__cxx11::string = std::__cxx11::basic_string<char>]':
C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp:30:33: required from here
C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp:10:7: warning: 'Data<int>::value' will be initialized after [-Wreorder]
T value;
^
C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp:9:17: warning: 'std::__cxx11::string Data<int>::name' [-Wreorder]
std::string name;
^
C:/Users/LPC/Documents/C_Plus_Plus/TestArea/main.cpp:12:5: warning: when initialized here [-Wreorder]
Data(std::string n, T v) : value {v}, name {n}
^
g++ -o ./Debug/TestArea @"TestArea.txt" -L.
mingw32-make.exe[1]: Leaving directory 'C:/Users/LPC/Documents/C_Plus_Plus/TestArea'
====1 errors, 3 warnings====
【问题讨论】:
-
这只是跨越多行的警告消息的一部分。相关部分是“警告:
Data<int>::value将在std::string Data<int>::name之后初始化”。 -
请将整组编译器消息复制并粘贴为文本。图片没用。
-
这似乎是说你的成员变量的声明顺序和你的构造函数初始化列表的顺序不匹配。变量将按照声明的顺序进行初始化,而不是列表的顺序。它也看起来像一个警告,而不是一个错误。将其视为文本会更容易。 godbolt.org/z/MdrbcKGxT
-
我没有看到实际错误。也许修复警告,看看会发生什么。我复制/粘贴了你的代码,它编译得很好。
标签: c++ class-template