在test1.cpp下面编译,但test2.cpp不编译。两者的唯一区别是,我在test1.cpp中的类声明中定义了Handle::add_it,但在test2.cpp中定义了外部的类声明。
test1.cpp :g++ test1.cpp -o test1 -std=c++11
#include <iostream>
template<typename B>
class Handle
{
public:
decltype(B.operator(int)) add_it(int x)
{
return b(x);
}
B b;
};
struct Add1
{
int operator()(int x)
{
return x + 1;
}
};
int main()
{
Handle<Add1> h;
std::cout << h.add_it(5) << std::endl;
}test2.cpp :g++ test2.cpp -o test2 -std=c++11
#include <iostream>
template<typename B>
class Handle
{
public:
decltype(B.operator(int)) add_it(int x);
B b;
};
template<typename B>
decltype(B.operator(int)) Handle<B>::add_it(int x)
{
return b(x);
}
struct Add1
{
int operator()(int x)
{
return x + 1;
}
};
int main()
{
Handle<Add1> h;
std::cout << h.add_it(5) << std::endl;
}误差
test2.cpp:13:11: error: expected primary-expression before ‘.’ token
decltype(B.operator(int))
^
test2.cpp:13:20: error: expected type-specifier before ‘(’ token
decltype(B.operator(int))
^
test2.cpp:13:21: error: expected primary-expression before ‘int’
decltype(B.operator(int))发布于 2016-01-12 09:56:14
您可以使用std::declval对此进行修改。
template<typename B>
class Handle
{
public:
decltype(std::declval<B>()(int())) add_it(int x) {
return b(x);
}
B b;
};Live Demo
或者超出了类的定义:
template<typename B>
class Handle {
public:
decltype(std::declval<B>()(int())) add_it(int x);
B b;
};
template<typename B>
decltype(std::declval<B>()(int())) Handle<B>::add_it(int x) {
return b(x);
}Live Demo
https://stackoverflow.com/questions/34740248
复制相似问题