首页 > 解决方案 > C++ 类模板:“从这里需要”错误

问题描述

我正在学习 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====

标签: c++class-template

解决方案


它与模板无关。

警告在这里是因为程序员经常(错误地)假设

: value {v}, name {n}`

表示value在之前初始化name。事实上,初始化顺序与声明顺序相匹配:

std::string name;
T value; 

初始化顺序在您的情况下并不重要,但它确实很重要。因此,避免意外并使初始化程序出现的顺序始终与声明顺序相匹配通常是一个好习惯。所以就这样做吧。


推荐阅读