c++ - 不能在派生模板类中使用 struct 吗?

标签 c++ templates struct g++

好吧,也许不是最好的标题,但事情是这样的:

我有一个模板化界面:

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/

相关文章:

swift - 设置实例属性时,是否在 URLSession dataTask 中使用 [weak self]?

C++ 从包含字符的文件中读取数字

c++ - 二叉树C++的层序遍历

c++ - 如何使用标记化即 strtok() 函数比较两个字符串?

c++ - 如何将现有模板类部分特化为新类型?

c++ - 定义寄存器堆栈数组

javascript - 'into' 警告从多个 this.render() 抛入 Ember.js

swift - 我一遍又一遍地使用相同的代码块。我如何巩固它?

c++ - 将 2 的补码转换为小数。输出是双

c - C语言中如何分配不同类型的内存?