Xcode 报错duplicate symbols for architecture x86_64

现象
// 报错代码
// a.h
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";}

// aa.h
void func_aa();

// aa.cpp
#include "a.h"
#include "aa.h"
void func_aa() {
    auto aa = A<std::string>(1);
}

// ab.h
void func_ab();

// ab.cpp
#include "a.h"
#include "ab.h"
void func_ab() {
    auto ab = A<std::string>(1);
    auto ab1 = A<std::vector<int>>(1);
}

// main.cpp
#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
  • 该方案能解决报错,但原因暂不能解释清楚=_= 欢迎高手解惑!
// aa_ab.h
void func_aa();
void func_ab();

// aa_ab.cpp
#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的构造函数改为函数模板, 特化移到类内
  • 标准做法:对函数模板进行特化
// a.h
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
  • 类模板A进行特化
  • 标准做法:对类模板进行特化
// a.h
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_;
};

你可能感兴趣的:(#,macOS,Xcode,符号重复)