我正在写一个共享库。这个想法如下: 库中的共享函数将使用int或double参数调用。它必须接受两者。在该功能的某一点上,有一个呼叫私人"对参数执行某些操作的函数,具体取决于它是int还是double。 我决定使用模板来实现库函数。如果我理解正确,编译器需要知道参数的类型,否则它无法编译库。因此,我实例化了两个模板,一个用于int,一个用于double。 问题是编译器似乎并不知道应该调用哪个版本的私有函数,尽管它知道它的参数类型。
已经很晚了,我不知道它有什么问题,请帮助我: - )
彼得
library.hpp
#include < iostream >
namespace {
void printNumber(int const n);
void printNumber(double const n);
}
namespace library {
template < typename T >
void doSomething(T const number);
}
library.cpp
#include "library.hpp"
using namespace std;
void printNumber(int const n) {
cout << "This was an int." << endl;
}
void printNumber(double const n) {
cout << "This was a double." << endl;
}
template < typename T >
void library::doSomething(T const number) {
// ...
// Do something that does not depend on T at all...
// ...
printNumber(number);
}
template void library::doSomething(int const number);
template void library::doSomething(double const number);
Main.cpp的
#include "library.hpp"
int main(int const argc, char const * (argv) []) {
library::doSomething(10);
library::doSomething(10.0);
return 0;
}
编译器
../src/library.cpp: In function ‘void library::doSomething(T) [with T = int]’:
../src/library.cpp:21:52: instantiated from here
../src/library.cpp:18:2: error: call of overloaded ‘printNumber(const int&)’ is ambiguous
../src/library.cpp:5:6: note: candidates are: void printNumber(int)
../src/library.cpp:9:6: note: void printNumber(double)
/home/petmal/Eclipse_Projects/library/include/library.hpp:6:6: note: void::printNumber(double)
/home/petmal/Eclipse_Projects/library/include/library.hpp:5:6: note: void::printNumber(int)
../src/library.cpp: In function ‘void library::doSomething(T) [with T = double]’:
../src/library.cpp:22:55: instantiated from here
../src/library.cpp:18:2: error: call of overloaded ‘printNumber(const double&)’ is ambiguous
../src/library.cpp:5:6: note: candidates are: void printNumber(int)
../src/library.cpp:9:6: note: void printNumber(double)
/home/petmal/Eclipse_Projects/library/include/library.hpp:6:6: note: void::printNumber(double)
/home/petmal/Eclipse_Projects/library/include/library.hpp:5:6: note: void::printNumber(int)
答案 0 :(得分:2)
您对匿名命名空间的使用不正确。您在匿名命名空间中声明printNumber(),然后在全局范围内定义它;这会导致歧义,因为您有两个 printNumber(int)
和两个 printNumber(double)
函数。
试试这个:
library.hpp:
#ifndef LIBRARY
#define LIBRARY
namespace library {
template < typename T >
void doSomething(T const number);
}
#endif
library.cpp:
#include <iostream>
#include "library.hpp"
using namespace std;
namespace {
void printNumber(int const n) {
cout << "This was an int." << endl;
}
void printNumber(double const n) {
cout << "This was a double." << endl;
}
}
template < typename T >
void library::doSomething(T const number) {
// ...
// Do something that does not depend on T at all...
// ...
printNumber(number);
}
template void library::doSomething<int>(int const number);
template void library::doSomething<double>(double const number);
main.cpp:如你的例子所示。
答案 1 :(得分:1)
删除使用命名空间std; 在核心代码中,声明要使用的std函数,例如:
int main() {
using std::cout;
using std::cin;
using std::endl;
//................. your code
}
,您的程序将正常运行。
答案 2 :(得分:0)
我认为模棱两可的原因是“10”可以是int或double。尝试将其作为一个或另一个投射,看看是否修复它。