Dan*_* K. 16 c++ templates dependent-name
这是代码:
template<typename T>
class base
{
public:
virtual ~base();
template<typename F>
void foo()
{
std::cout << "base::foo<F>()" << std::endl;
}
};
template<typename T>
class derived : public base<T>
{
public:
void bar()
{
this->foo<int>(); // Compile error
}
};
Run Code Online (Sandbox Code Playgroud)
而且,在运行时:
derived<bool> d;
d.bar();
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
error: expected primary-expression before ‘int’
error: expected ‘;’ before ‘int’
Run Code Online (Sandbox Code Playgroud)
我知道非依赖名称和两阶段查找.但是,当函数本身是模板函数(foo<>()我的代码中的函数)时,我尝试了所有变通方法只是失败了.
Mik*_*our 28
foo是一个从属名称,因此第一阶段查找假定它是一个变量,除非您使用typename或template关键字指定其他名称.在这种情况下,您需要:
this->template foo<int>();
Run Code Online (Sandbox Code Playgroud)
如果你想要所有的血腥细节,请看这个问题.
BЈо*_*вић 11
你应该这样做:
template<typename T>
class derived : public base<T>
{
public:
void bar()
{
base<T>::template foo<int>();
}
};
Run Code Online (Sandbox Code Playgroud)
这是一个完整的可编辑示例:
#include <iostream>
template<typename T>
class base
{
public:
virtual ~base(){}
template<typename F>
void foo()
{
std::cout << "base::foo<F>()" << std::endl;
}
};
template<typename T>
class derived : public base<T>
{
public:
void bar()
{
base<T>::template foo<int>(); // Compile error
}
};
int main()
{
derived< int > a;
a.bar();
}
Run Code Online (Sandbox Code Playgroud)