我应该写:
template<class T> class Foo {
typename const T* x;
};
或:
template<class T> class Foo {
const typename T* x;
};
答案 0 :(得分:3)
typename
不是这样使用的,所以这两种情况都是无效的,应该产生编译错误,如下所示:
main.cpp:4:20: error: expected a qualified name after 'typename'
const typename T* x;
^
在这里你需要T::myType
这样的东西继续下去。
甚至这个,更糟糕的是:
main.cpp:4:14: error: expected a qualified name after 'typename'
typename const T* x;
^
main.cpp:4:14: error: expected member name or ';' after declaration specifiers
expected a qualified name after 'typename'中的相关示例。
引入了关键字typename以指定后面的标识符是类型
答案 1 :(得分:2)
typename
需要使用您想要获得的类型。例如,如果你有
template <typename T>
void foo(T& t)
{
typename const T::iterator bar = t.begin();
}
int main()
{
std::vector<int> bar{1,2,3}
foo(bar);
}
您将在
的行中获得typename const T::const_iterator bar = t.begin();
的编译器错误
在'const'
之前的预期嵌套名称说明符
在哪里
const typename T::iterator bar = t.begin();
工作得很好。
有关template
和typename
需要出现的时间,地点和原因的全面说明,请参阅:Where and why do I have to put the "template" and "typename" keywords?
答案 2 :(得分:0)
在这里使用extern inline char * strcpy(char * dest,const char *src)
{
__asm__("cld\n"
"1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
::"S" (src),"D" (dest):"si","di","ax");
return dest;
}
毫无意义。
如果您要访问typename
和T::type
之间不能const
的别名类型,则必须使用1>}
typename