好吧,也许不是最好的标题,但事情是这样的:
我有一个模板化界面:
template<typename T>
class MyInterface
{
public:
struct MyStruct
{
T value;
};
virtual void doThis(MyStruct* aPtr) = 0;
};
和一个实现:
template <typename T>
class MyImpl : public MyInterface<T>
{
public:
void doThis(MyStruct* aPtr)
{
} // doThis
};
但是,编译器提示:
In file included from MyTest.cpp:3:0:
MyImpl.h:7:17: error: ‘MyStruct’ has not been declared
void doThis(MyStruct* aPtr)
这是为什么?
最佳答案
以下内容为我编译:
template<typename T>
class MyInterface
{
public:
struct MyStruct
{
T value;
};
virtual void doThis(MyStruct* aPtr) = 0;
};
template <typename T>
class MyImpl : public MyInterface<T>
{
public:
void doThis(typename MyInterface<T>::MyStruct* aPtr)
{
}
};
int main() {
MyImpl<int> t;
}
主要的变化是您需要限定 MyStruct
被定义在MyInterface<T>
内.
由于编译器无法确定模板化子类型是哪种标识符,因此您必须使用 typename
来帮助它。关键词。 (有关类型名称的更多详细信息,请参阅 When is the "typename" keyword necessary?)
关于c++ - 不能在派生模板类中使用 struct 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29844616/