gpt4 book ai didi

c++ - 错误 C2899 : typename cannot be used outside a template declaration

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:36 26 4
gpt4 key购买 nike

我正在 MSV2010 中尝试以下内容

namespace statismo {
template<>
struct RepresenterTraits<itk::Image<itk::Vector<float, 3u>, 3u> > {

typedef itk::Image<itk::Vector<float, 3u>, 3u> VectorImageType;
typedef VectorImageType::Pointer DatasetPointerType;
typedef VectorImageType::Pointer DatasetConstPointerType;
typedef typename VectorImageType::PointType PointType;
typedef typename VectorImageType::PixelType ValueType;
};

我收到以下错误:

error C2899: typename 不能在模板声明之外使用

如果您能提供解决方法的帮助,我们将不胜感激。

最佳答案

namespace statismo {
template<>
struct RepresenterTraits<itk::Image<itk::Vector<float, 3u>, 3u> > {

// bla

typedef typename VectorImageType::PointType PointType;
^^^^^^^^

typedef typename VectorImageType::PixelType ValueType;
^^^^^^^^
};

你的 typename关键字放在 RepresenterTraits<T> 的显式特化中对于 itk::Image<itk::Vector<float, 3u>, 3u> .但是,这是一个常规类,而不是类模板。这意味着 VectorImageType不是从属名称,编译器知道 PixelType是嵌套类型。这就是为什么不允许使用 typename 的原因.另见 this Q&A .

请注意,在 C++11 中,此限制已取消,并且可以使用 typename在非模板上下文中允许但不要求。参见例如这个例子

#include <iostream>

template<class T>
struct V
{
typedef T type;
};

template<class T>
struct S
{
// typename required in C++98/C++11
typedef typename V<T>::type type;
};

template<>
struct S<int>
{
// typename not allowed in C++98, allowed in C++11
// accepted by g++/Clang in C++98 mode as well (not by MSVC2010)
typedef typename V<int>::type type;
};

struct R
{
// typename not allowed in C++98, allowed in C++11
// accepted by g++ in C++98 mode as well (not by Clang/MSVC2010)
typedef typename V<int>::type type;
};

int main()
{
}

Live Example (只需使用 g++/clang 和 std=c++98/std=c++11 命令行选项)。

关于c++ - 错误 C2899 : typename cannot be used outside a template declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com