现象
template<typename T>
struct A {
public:
A(int a):a_(a){std::cout << "A";}
private:
int a_;
};
template<>
A<std::string>::A(int a):a_(a){std::cout << "string A";}
template<>
A<std::vector<int>>::A(int a):a_(a){std::cout << "vector A";}
void func_aa();
#include "a.h"
#include "aa.h"
void func_aa() {
auto aa = A<std::string>(1);
}
void func_ab();
#include "a.h"
#include "ab.h"
void func_ab() {
auto ab = A<std::string>(1);
auto ab1 = A<std::vector<int>>(1);
}
#include "aa.h"
#include "ab.h"
int main(){
func_aa();
func_ab();
return 0;
}
解决方案
方案1
- 将aa.h aa.cpp ab.h ab.cpp合并成aa_ab.h aa_ab.cpp
- 该方案能解决报错,但原因暂不能解释清楚=_= 欢迎高手解惑!
void func_aa();
void func_ab();
#include "a.h"
#include "aa_ab.h"
void func_ab() {
auto ab = A<std::string>(1);
auto ab1 = A<std::vector<int>>(1);
}
void func_aa() {
auto aa = A<std::string>(1);
}
方案2
- 将A的构造函数改为函数模板, 特化移到类内
- 标准做法:对函数模板进行特化
template<typename T>
struct A {
public:
template<typename T1>
A(T1 a):a_(a){std::cout << "A";}
template<>
A(std::string a):a_(a){std::cout << "string A";}
template<>
A(std::vector<int> a):a_(a){std::cout << "vector A";}
T a_;
};
方案3
template<typename T>
struct A {
public:
A(int a):a_(a){std::cout << "A";}
void print(){std::cout << "A print";}
private:
int a_;
};
template<>
struct A<std::string> {
public:
A(int a){std::cout << "string A";}
private:
int a_;
};
template<>
struct A<std::vector<int>> {
public:
A(int a){std::cout << "vector A";}
private:
int a_;
};