所以我有一个类模板,例如
模板.h
template <typename T>
class Something {
public:
static_assert(std::is_floating_point<T>::value, "Floating Point only");
};
我将float
和double
专业化分成不同的 .h 文件
浮动.h
#include "Template.h"
template<>
class Something<float> {
public:
std::string Name = "Float";
void DoSomething() {
std::cout << "Float Thing\n";
}
};
和
双倍.h
#include "Template.h"
template<>
class Something<float> {
public:
std::string Name = "Double";
void DoSomething() {
std::cout << "Double Thing\n";
}
};
我在我的文件中按顺序包含了这三个文件.cpp
,它工作正常
但我需要向float
以Something作为参数的专业化添加另一个函数
void SayDouble(Something<double> _D) {
std::cout << _D.Name << '\n';
}
然后包含Double.h
aftertemplate.h
并且它可以工作,但是当我尝试在其中执行相同操作Double.h
并添加一个接受或返回Something<float>
并包含float.h
after的函数时tempalte.h
。它给了我很多关于重新实例化的错误
Float.h(17,19): error C2039: 'Name': is not a member of 'Something<double>'
1>Float.h(16): message : see declaration of 'Something<double>'
1>Double.h(7,1): error C2908: explicit specialization; 'Something<double>' has already been instantiated
1>Double.h(19,2): error C2766: explicit specialization; 'Something<double>' has already been defined
1>Float.h(16): message : see previous definition of 'Something<double>'
1>Float.h(19,2): error C2766: explicit specialization; 'Something<float>' has already been defined
1>Float.h(7): message : see previous definition of 'Something<float>
我不太明白我猜想的问题是,可能在函数签名中对模板进行专门化会实例化模板,然后当它尝试在定义中再次实例化它时,它给出“已定义错误”但我不不知道如何解决这个问题,因为我需要有引用其他专业的函数
我正在使用 Visual Studio Community 2019 版本 16.11.6