2011-06-30 110 views
2

在下面的代码模板的错误,我得到的是我没有一个编译错误,如果我删除模板:与相关的名称

template<int DIM> class myClass 
{ 
public : 
    enum Mode {aa,bb}; 
    myClass(){}; 
}; 

template<int DIM> class myClass2 
{ 
    myClass2(){}; 
    void myfunc(myClass::Mode m); 
}; 

template<int DIM> 
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m) 
{ 
} 

TEST.CPP(19):警告C4346:' MyClass的::模式”:依赖名称不是
类型前缀与‘类型名称’指示类型
TEST.CPP(19):错误C2146:语法错误:缺少‘)’前标识符‘M’

如果我删除类似:

template<int DIM> 
void myClass2<DIM>::myfunc(myClass::Mode m) 

我得到:

TEST.CPP(19):错误C2955: 'MyClass的':使用类模板需要模板参数列表

如果我把myfunc的定义直接放在类的声明中(我想避免),它的工作原理。

我该怎么做,为什么会发生这种情况?

谢谢

+3

在我看来警告而明确: “前缀'MyClass的 :: Mode'用'typename'”。 –

+0

请您在下一次提问时发现实际的源代码包含错误,而不是像它或它的某个部分。有关如何以及为什么要发布最小的完整示例程序的信息,请参阅http://sscce.org。 –

+0

@Caron:事实上,当你知道它的时候,这似乎很清楚。但是,当你从来没有这样的警告,并且从来没有看到一个代码需要用typename关键字(我的意思是,除了内部模板)声明一个类型名称,这听起来像所有的奇怪的警告,没什么意义....:/ @Rob:好的。 – WhitAngl

回答

6

我相信你在你的代码中有两个问题。首先是在这个声明中myClass2

void myfunc(myClass::Mode m); 

因为myClass是一个模板,需要指定模板参数是什么。我认为你可能是指写

void myfunc(myClass<DIM>::Mode m); 

然而,由于在C++中一个奇怪的癖好,你会写为

void myfunc(typename myClass<DIM>::Mode m); 

typename关键字这里告诉C++是Mode是一个名字嵌套在类myClass<DIM>中。

同样地,在后面的代码,该代码

template<int DIM> 
void myClass2<DIM>::myfunc(myClass<DIM>::Mode m) 
{ 
} 

应该读

template<int DIM> 
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m) 
{ 
} 

告诉编译器Mode是一个类型的名称。

希望这会有所帮助!

+0

是啊!谢谢大家,我错过了typename!我不知道我们必须补充说明,因为Mode显然是一种类型....!第一个问题只是一个错字:p谢谢,它现在有效:)(4分钟左右验证) – WhitAngl

1

在这里你去...

template<int DIM> class myClass 
{ 
public : 
    enum Mode {aa,bb}; 
    myClass(){}; 
}; 

template<int DIM> class myClass2 
{ 
    myClass2(){}; 

    // you need to pass the template parameter to myClass 
    // "typename" needs to be present when using types from templated classes 
    // from within a templated class/function. 
    void myfunc(typename myClass<DIM>::Mode m); 
}; 

template<int DIM> 
void myClass2<DIM>::myfunc(typename myClass<DIM>::Mode m) 
{ 
} 
相关问题