跨文件共享的C ++模板特化定义

时间:2017-05-20 04:17:17

标签: c++ templates linker linker-errors multiple-files

我有一个模板类"额外,"在" extra.h中定义,"功能" doSomething,"我已经定义了" doSomething的两个专业。"两个不同的函数创建类型为" Extra,"每个都有不同的类型参数,每个都调用不同的一个特化。两个客户端功能," client1"和" client2,"在两个文件中定义," client1.cpp"和" client2.cpp,"分别。在第三个文件中," main"电话"客户1"然后" client2。"现在," client1.cpp"和" client2.cpp" #include" extra.h。"我收到一个链接器错误" doSomething"有(2)多个定义。当然,如果我把" client1"的定义。和" client2"进入单个源文件,我没有这个问题。有什么方法可以保留我对#34; client1"的不同文件的安排。和" client2"?以下是我的代码。谢谢!

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="">
  <div id="ingredient-showcase">
    <div class="ingredient" ng-click="description = 'description 1'">
      <img src="..." alt="...">
    </div>
    <div class="ingredient" ng-click="description = 'description 2'">
      <img src="..." alt="..." />
    </div>
    <div class="ingredient" ng-click="description = 'description 3'">
      <img src="..." alt="..." />
    </div>
    ...
  </div>
  <p id="description">{{ description }}</p>
</div>

在这里,对于completness,是我的链接器错误:

// extra.h
#ifndef EXTRA_H
#define EXTRA_H

template <typename T>
class Extra
{
    public:
        Extra(T);
        ~Extra();
        T doSomething(T);
    private:
        Extra() {}
        T m_value;
};

template <typename T> Extra<T>::Extra(T input) : m_value{input} {}

template <typename T> Extra<T>::~Extra() {}

template <> int Extra<int>::doSomething(int input)
{
    return input * m_value;
}

template <> double Extra<double>::doSomething(double input)
{
    return input + m_value;
}

template <typename T> T Extra<T>::doSomething(T input)
{
    return input;
}
#endif

// client1.cpp
#include "extra.h"
#include <iostream>

void client1()
{
    std::cout << "In client1." << std::endl;
    Extra<int> extra(2);
    int res = extra.doSomething(3);
    std::cout << "Value: " << res << std::endl;
}

// client2.cpp
#include "extra.h"
#include <iostream>

void client2()
{
    std::cout << "In client2." << std::endl;
    Extra<double> extra(2.0);
    double res = extra.doSomething(2.0);
    std::cout << "Value: " << res << std::endl;
}

// main.cpp
#include <iostream>

void client1();
void client2();

int main()
{
    std::cout << "In main." << std::endl;
    client1();
    client2();
    return 0;
}

1 个答案:

答案 0 :(得分:3)

您需要标记doSomething内联:

template <> inline int Extra<int>::doSomething(int input)
{
    return input * m_value;
}

template <> inline double Extra<double>::doSomething(double input)
{
    return input + m_value;
}