为什么我在这个程序上遇到链接错误(使用gcc 4.6.2):
#include <iostream>
// prints something;
// the template doesn't add anything
template <typename T>
struct Printer
{
void print()
{
std::cout << "Printer::print" << std::endl;
}
};
// this is an actual template
// calls the method indicated by the second template argument
// belonging to the class indicated by the first template argument
template < typename U, void(U::*func)()>
struct Caller
{
void call(U obj)
{
(obj.*func)();
}
};
// just a wrapper
template<typename V>
struct Wrapper
{
void call_caller_on_printer()
{
Printer<int> a_printer;
Caller<Printer<int>, &Printer<int>::print> caller;
caller.call(a_printer);
}
};
int main()
{
Wrapper<int> the_wrapper;
the_wrapper.call_caller_on_printer();
return 0;
}
链接器抱怨Printer :: print是一个未定义的引用。但是,如果你使Wrapper成为非模板(模板不会在那里添加任何东西),它就可以了。打印机的打印方法似乎没有实例化。那是为什么?
答案 0 :(得分:0)
我在GCC 4.5.1上遇到了问题that looks similar(是的,它看起来像回归)。
在我的例子中,它有助于显式地将指针强制转换为所需的类型,以使GCC 4.5.1吞下这段代码。尝试在这里做同样的事情。即。
Caller<Printer<int>, static_cast<void (Printer<int>::*)()>(&Printer<int>::print)> caller;
(未经测试;顺便提一下,这里的语法在语法上是否有效?否则元函数可能会有所帮助。)