【发布时间】:2019-11-16 19:20:47
【问题描述】:
我有一个模板类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 没有用,但如果能用,那就太理想了。
【问题讨论】:
-
模板只有标题,没有cc文件!
-
@OblivionreinstateOurMonica,是的
class_A是模板类,因此它只是标题,而不是class_B。 -
@MichaelKenzel 模板针对相关类型显式实例化,参见例如
template double class_B::Evaluate(double parameter);. -
您是否针对 C++14 或更高版本进行编译? (您使用
std::get时需要) -
确实,这是问题的一部分,谢谢