Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数接受模板类的内部类时出现问题_C++_Templates - Fatal编程技术网

C++ 函数接受模板类的内部类时出现问题

C++ 函数接受模板类的内部类时出现问题,c++,templates,C++,Templates,我对类模板中的内部类有问题。我有一个模板类(比如:Matrix)和一个子类(比如:Matrix::Row)。现在我想写一个函数,它在子类的实例上运行(比如:negate(Matrix::Row&))。我试图用模板否定(typename Matrix::Row&)声明函数,但当我尝试使用它时,编译器告诉我它找不到匹配项 下面是一个抽象的例子: template<class T> class A { public: class B { }; }; templat

我对类模板中的内部类有问题。我有一个模板类(比如:
Matrix
)和一个子类(比如:
Matrix::Row
)。现在我想写一个函数,它在子类的实例上运行(比如:
negate(Matrix::Row&)
)。我试图用
模板否定(typename Matrix::Row&)
声明函数,但当我尝试使用它时,编译器告诉我它找不到匹配项

下面是一个抽象的例子:

template<class T>
class A
{
public:
    class B
    {
    };
};

template<class T>
void x(typename A<T>::B &)
{
}

int main()
{
    A<int>::B b;
    x(b); // doesn't work: Error: Could not find a match
          // for x<T>(A<int>::B) needed in main().
    x<int>(b); // works fine
}
模板
甲级
{
公众:
B类
{
};
};
模板
void x(类型名A::B&)
{
}
int main()
{
A::B;
x(b);//不工作:错误:找不到匹配项
//对于main()中需要的x(A::B)。
x(b);//工作正常
}
为什么编译器在第一种情况下无法找到
x
?是否有一种方法可以修改它(不显式指定类型
int

(我也有类似的问题,
x
的形式是
template void x(typename A::B&,const S&);
,我真的不想在调用时被迫显式命名所有类型。)


我已经在g++4.4.3、g++4.5.2和Sun Studio 5.9中尝试过这一点,它们都给出了相同的结果。提前非常感谢您的帮助

这是不可推断的上下文。这就是编译器无法推导模板参数的原因

想象一下,您可能有如下专门化的
A

template <>
struct A<SomeType>
{
    typedef std::map <double, double> B;
};
甚至这种专门化也将
B
作为嵌套类型


现在如果我说
A::B
std::map
,那么你能说
T
是什么吗?它是某种类型的吗?或者
其他类型的

不可推断的上下文。这就是编译器无法推导模板参数的原因

想象一下,您可能有如下专门化的
A

template <>
struct A<SomeType>
{
    typedef std::map <double, double> B;
};
甚至这种专门化也将
B
作为嵌套类型


现在如果我说
A::B
std::map
,那么你能说
T
是什么吗?它是某种类型的吗?或者
SomeOtherType

需要为模板函数x的调用推导类型T,并且模板参数推导仅在一组特定的情况下允许:

A::B

似乎不是其中之一:/

需要为模板函数x的调用推断类型T,并且模板参数推断仅在特定的情况下才允许:

A::B

似乎不是其中之一:/

编译器应该如何推断这一点?设想以下设置:

struct A { typedef int T; };
struct B { typedef int T; };

template <typename S> void foo(typename S::T);
struct A{typedef int T;};
结构B{typedef int T;};
模板void foo(typename S::T);
现在当你说
intx;foo(x),无法明确地匹配这一点


关键是,您并不是从给定的类模板推导模板参数,而是一个任意的、独立的类型。该类型是在另一个类中定义的这一事实与此无关。

编译器应该如何推断这一点?设想以下设置:

struct A { typedef int T; };
struct B { typedef int T; };

template <typename S> void foo(typename S::T);
struct A{typedef int T;};
结构B{typedef int T;};
模板void foo(typename S::T);
现在当你说
intx;foo(x),无法明确地匹配这一点


关键是,您并不是从给定的类模板推导模板参数,而是一个任意的、独立的类型。该类型是在另一个类中定义的这一事实与此无关。

+1表示的是+1,表示的是+1,这是有意义的;谢谢我想我会把我的类Matrix::Row改为MatrixRow,这可能是解决我问题的最好办法;谢谢我想我会把我的类Matrix::Row改为MatrixRow,这可能是解决我问题的最好办法。谢谢你的回答!我希望,因为在我的代码中,只有一种方法可以解析它,编译器会这样做。但我错了…谢谢你的回答!我希望,因为在我的代码中,只有一种方法可以解析它,编译器会这样做。但我错了。。。