我有一个模板类"额外,"在" 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;
}
答案 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;
}