有没有办法在非模板类中定义模板成员#2

Is there a way to define a template member in a non-template class? #2

本文关键字:定义 成员 有没有      更新时间:2023-10-16

我有一个模板类class_A:

// class_A.h
#pragma once
#include <iostream>
#include <tuple>
template <class T>
class class_A
{
public:
class_A(){}
T Function_A(T parameter)
{
return parameter;
}
};

我正试图在非模板类class_B中用作私有成员:

// class_B.h
#pragma once
#include <tuple>
#include <iostream>
#include "class_A.h"
class class_B
{
public:
class_B();
template <typename T> T Evaluate(T parameter);
private:
std::tuple<class_A<double>, class_A<char> > As;
};

// class_B.cc
#include "class_B.h"
class_B::class_B(){}
template <typename T>
T class_B::Evaluate(T parameter)
{
return std::get<class_A<T>>(As).Function_A(parameter); //This is causing error
//return parameter // This works
}
template double class_B::Evaluate(double parameter);
template char class_B::Evaluate(char parameter);

我的main.cc是:

// main.cc
#include<iostream>
#include <string>
#include "class_B.h"
using namespace std;

int main()
{
class_B B;
std::cout<< B.Evaluate(5.2) <<std::endl;
std::cout << B.Evaluate('h') << std::endl;
return 0;
}

我得到以下错误:

src/class_B.cc:8:12: error: no matching function for call to 'get'
return std::get<class_A<T>>(As).Evaluate(parameter);
.
.
.
etc.

这是一个答案的试验:https://stackoverflow.com/a/55357742/9203360这并不奏效,但如果真的奏效了,那就太理想了。

正如我在评论中提到的,std::get的重载将一个类型作为模板参数并返回该类型的元组元素,只有在C++14之后才可用。

根据您的注释,您不是根据C++14或更高版本进行编译的,因此没有与std::get匹配的类型作为第一个模板参数。

std::get<class_A<T>>(As(

获取class_A的实例,因此无法调用Evaluate方法,该方法不存在。您应该调用方法Function_A,或者在类_A 中定义Evaluate方法

return std::get<class_A<T>>(As).Function_A(parameter); // Call Function_A

它适用于Visual Studio 2015-Windows平台10.0.17763.0

另外,std::get需要c++14才能工作。